Perl - регулярные выражения
Регулярное выражение - это строка символов, которая определяет шаблон или шаблоны, которые вы просматриваете. Синтаксис регулярных выражений в Perl очень похож на то, что вы найдете в других программах поддержки регулярных выражений, таких какsed, grep, и awk.
Основным методом применения регулярного выражения является использование операторов привязки шаблона = ~ и !~. Первый оператор - это оператор проверки и присваивания.
В Perl есть три оператора регулярных выражений.
- Соответствие регулярному выражению - m //
- Заменить регулярное выражение - s ///
- Транслитерация регулярного выражения - tr ///
Косые черты в каждом случае действуют как разделители для регулярного выражения (regex), которое вы указываете. Если вас устраивает любой другой разделитель, вы можете использовать вместо косой черты.
Оператор матча
Оператор сопоставления m // используется для сопоставления строки или оператора с регулярным выражением. Например, чтобы сопоставить последовательность символов «foo» со скалярным символом $ bar, вы можете использовать такой оператор:
#!/usr/bin/perl
$bar = "This is foo and again foo";
if ($bar =~ /foo/) {
print "First time is matching\n";
} else {
print "First time is not matching\n";
}
$bar = "foo";
if ($bar =~ /foo/) {
print "Second time is matching\n";
} else {
print "Second time is not matching\n";
}
Когда вышеуказанная программа выполняется, она дает следующий результат -
First time is matching
Second time is matching
На самом деле m // работает так же, как и серия операторов q //. Вы можете использовать любую комбинацию естественно совпадающих символов в качестве разделителей для выражения. Например, m {}, m () и m> <допустимы. Итак, приведенный выше пример можно переписать следующим образом:
#!/usr/bin/perl
$bar = "This is foo and again foo";
if ($bar =~ m[foo]) {
print "First time is matching\n";
} else {
print "First time is not matching\n";
}
$bar = "foo";
if ($bar =~ m{foo}) {
print "Second time is matching\n";
} else {
print "Second time is not matching\n";
}
Вы можете опустить m из m //, если разделители представляют собой косую черту, но для всех других разделителей вы должны использовать префикс m.
Обратите внимание, что все выражение соответствия, то есть выражение слева от = ~ или! ~ И оператора соответствия, возвращает истину (в скалярном контексте), если выражение соответствует. Поэтому заявление -
$true = ($foo =~ m/foo/);
установит $ true в 1, если $ foo соответствует регулярному выражению, или 0, если совпадение не удалось. В контексте списка совпадение возвращает содержимое любых сгруппированных выражений. Например, при извлечении часов, минут и секунд из строки времени мы можем использовать -
my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);
Модификаторы оператора сопоставления
Оператор сопоставления поддерживает собственный набор модификаторов. Модификатор / g позволяет выполнять глобальное сопоставление. Модификатор / i сделает совпадение нечувствительным к регистру. Вот полный список модификаторов
Sr.No. | Модификатор и описание |
---|---|
1 | i Делает совпадение нечувствительным к регистру. |
2 | m Указывает, что если в строке есть символы новой строки или возврата каретки, операторы ^ и $ теперь будут соответствовать границе новой строки, а не границе строки. |
3 | o Оценивает выражение только один раз. |
4 | s Позволяет использовать. для соответствия символу новой строки. |
5 | x Позволяет использовать пробелы в выражении для ясности. |
6 | g Глобально находит все совпадения. |
7 | cg Позволяет продолжить поиск даже после сбоя глобального сопоставления. |
Соответствие только один раз
Существует также более простая версия оператора сопоставления -? PATTERN? оператор. Это в основном идентично оператору m // за исключением того, что он соответствует только один раз в строке, которую вы ищете между каждым вызовом сброса.
Например, вы можете использовать это, чтобы получить первый и последний элементы в списке -
#!/usr/bin/perl
@list = qw/food foosball subeo footnote terfoot canic footbrdige/;
foreach (@list) {
$first = $1 if /(foo.*?)/;
$last = $1 if /(foo.*)/;
}
print "First: $first, Last: $last\n";
Когда вышеуказанная программа выполняется, она дает следующий результат -
First: foo, Last: footbrdige
Переменные регулярного выражения
Переменные регулярного выражения включают $, который содержит все, что соответствует последнему совпадению группировки; $&, который содержит всю совпавшую строку; $`, который содержит все до совпадающей строки; и$', который содержит все, что находится после совпавшей строки. Следующий код демонстрирует результат -
#!/usr/bin/perl
$string = "The food is in the salad bar";
$string =~ m/foo/;
print "Before: $`\n";
print "Matched: $&\n";
print "After: $'\n";
Когда вышеуказанная программа выполняется, она дает следующий результат -
Before: The
Matched: foo
After: d is in the salad bar
Оператор замещения
Оператор подстановки, s ///, на самом деле является просто расширением оператора сопоставления, которое позволяет вам заменять сопоставленный текст некоторым новым текстом. Основная форма оператора -
s/PATTERN/REPLACEMENT/;
ШАБЛОН - это регулярное выражение для текста, который мы ищем. ЗАМЕНА - это спецификация для текста или регулярного выражения, которое мы хотим использовать для замены найденного текста. Например, мы можем заменить все вхожденияdog с участием cat используя следующее регулярное выражение -
#/user/bin/perl
$string = "The cat sat on the mat";
$string =~ s/cat/dog/;
print "$string\n";
Когда вышеуказанная программа выполняется, она дает следующий результат -
The dog sat on the mat
Модификаторы оператора подстановки
Вот список всех модификаторов, используемых с оператором подстановки.
Sr.No. | Модификатор и описание |
---|---|
1 | i Делает совпадение нечувствительным к регистру. |
2 | m Указывает, что если в строке есть символы новой строки или возврата каретки, операторы ^ и $ теперь будут соответствовать границе новой строки, а не границе строки. |
3 | o Оценивает выражение только один раз. |
4 | s Позволяет использовать. для соответствия символу новой строки. |
5 | x Позволяет использовать пробелы в выражении для ясности. |
6 | g Заменяет все вхождения найденного выражения текстом замены. |
7 | e Оценивает замену, как если бы это был оператор Perl, и использует его возвращаемое значение в качестве текста замены. |
Оператор перевода
Перевод аналогичен принципам подстановки, но не идентичен им, но, в отличие от подстановки, перевод (или транслитерация) не использует регулярные выражения для поиска значений замены. Операторы перевода -
tr/SEARCHLIST/REPLACEMENTLIST/cds
y/SEARCHLIST/REPLACEMENTLIST/cds
Перевод заменяет все вхождения символов в SEARCHLIST на соответствующие символы в REPLACEMENTLIST. Например, используя «Кот сел на циновку». строка, которую мы использовали в этой главе -
#/user/bin/perl
$string = 'The cat sat on the mat';
$string =~ tr/a/o/;
print "$string\n";
Когда вышеуказанная программа выполняется, она дает следующий результат -
The cot sot on the mot.
Также можно использовать стандартные диапазоны Perl, позволяющие указывать диапазоны символов буквами или числовыми значениями. Чтобы изменить регистр строки, вы можете использовать следующий синтаксис вместоuc функция.
$string =~ tr/a-z/A-Z/;
Модификаторы оператора перевода
Ниже приводится список операторов, связанных с переводом.
Sr.No. | Модификатор и описание |
---|---|
1 | c Дополняет SEARCHLIST. |
2 | d Удаляет найденные, но незамещенные символы. |
3 | s Сдавливает повторяющиеся замененные символы. |
Модификатор / d удаляет символы, соответствующие SEARCHLIST, для которых нет соответствующей записи в REPLACEMENTLIST. Например -
#!/usr/bin/perl
$string = 'the cat sat on the mat.';
$string =~ tr/a-z/b/d;
print "$string\n";
Когда вышеуказанная программа выполняется, она дает следующий результат -
b b b.
Последний модификатор / s удаляет повторяющиеся последовательности замененных символов, поэтому -
#!/usr/bin/perl
$string = 'food';
$string = 'food';
$string =~ tr/a-z/a-z/s;
print "$string\n";
Когда вышеуказанная программа выполняется, она дает следующий результат -
fod
Более сложные регулярные выражения
Вам не нужно просто сопоставлять фиксированные строки. Фактически, вы можете сопоставить практически все, о чем только можете мечтать, используя более сложные регулярные выражения. Вот небольшая шпаргалка -
В следующей таблице перечислены синтаксисы регулярных выражений, доступные в Python.
Sr.No. | Узор и описание |
---|---|
1 | ^ Соответствует началу строки. |
2 | $ Соответствует концу строки. |
3 | . Соответствует любому одиночному символу, кроме новой строки. Использование опции m также позволяет сопоставить новую строку. |
4 | [...] Соответствует любому одиночному символу в скобках. |
5 | [^...] Соответствует любому одиночному символу, не указанному в скобках. |
6 | * Соответствует 0 или более вхождениям предыдущего выражения. |
7 | + Соответствует 1 или нескольким вхождениям предыдущего выражения. |
8 | ? Соответствует 0 или 1 вхождению предыдущего выражения. |
9 | { n} Соответствует ровно n повторениям предыдущего выражения. |
10 | { n,} Соответствует n или нескольким вхождениям предыдущего выражения. |
11 | { n, m} Соответствует минимум n и максимум m вхождениям предыдущего выражения. |
12 | a| b Соответствует либо a, либо b. |
13 | \w Соответствует символам слова. |
14 | \W Соответствует несловесным символам. |
15 | \s Соответствует пробелу. Эквивалентно [\ t \ n \ r \ f]. |
16 | \S Соответствует пробелам. |
17 | \d Соответствует цифрам. Эквивалентно [0-9]. |
18 | \D Соответствует нецифровым значениям. |
19 | \A Соответствует началу строки. |
20 | \Z Соответствует концу строки. Если новая строка существует, она соответствует непосредственно перед новой строкой. |
21 год | \z Соответствует концу строки. |
22 | \G Точка совпадения, в которой закончился последний матч. |
23 | \b Соответствует границам слова вне скобок. Соответствует пробелу (0x08) внутри скобок. |
24 | \B Соответствует границам без слов. |
25 | \n, \t, etc. Соответствует символам новой строки, возврата каретки, табуляции и т. Д. |
26 | \1...\9 Соответствует n-му сгруппированному подвыражению. |
27 | \10 Соответствует n-му сгруппированному подвыражению, если оно уже совпало. В противном случае относится к восьмеричному представлению символьного кода. |
28 | [aeiou] Соответствует одному символу в данном наборе |
29 | [^aeiou] Соответствует одному символу вне заданного набора |
Метасимвол ^ соответствует началу строки, а метасимвол $ соответствует концу строки. Вот несколько кратких примеров.
# nothing in the string (start and end are adjacent)
/^$/
# a three digits, each followed by a whitespace
# character (eg "3 4 5 ")
/(\d\s) {3}/
# matches a string in which every
# odd-numbered letter is a (eg "abacadaf")
/(a.)+/
# string starts with one or more digits
/^\d+/
# string that ends with one or more digits
/\d+$/
Давайте посмотрим на другой пример.
#!/usr/bin/perl
$string = "Cats go Catatonic\nWhen given Catnip";
($start) = ($string =~ /\A(.*?) /);
@lines = $string =~ /^(.*?) /gm;
print "First word: $start\n","Line starts: @lines\n";
Когда вышеуказанная программа выполняется, она дает следующий результат -
First word: Cats
Line starts: Cats When
Соответствующие границы
В \bсоответствует любой границе слова, как определено разницей между классом \ w и классом \ W. Поскольку \ w включает символы для слова, а \ W наоборот, это обычно означает завершение слова. В\Bутверждение соответствует любой позиции, не являющейся границей слова. Например -
/\bcat\b/ # Matches 'the cat sat' but not 'cat on the mat'
/\Bcat\B/ # Matches 'verification' but not 'the cat on the mat'
/\bcat\B/ # Matches 'catatonic' but not 'polecat'
/\Bcat\b/ # Matches 'polecat' but not 'catatonic'
Выбор альтернатив
| символ аналогичен стандартному или поразрядному ИЛИ в Perl. Он определяет альтернативные совпадения в регулярном выражении или группе. Например, чтобы сопоставить «кошка» или «собака» в выражении, вы можете использовать это -
if ($string =~ /cat|dog/)
Вы можете группировать отдельные элементы выражения вместе, чтобы поддерживать сложные совпадения. Поиск имен двух людей может быть выполнен с помощью двух отдельных тестов, например:
if (($string =~ /Martin Brown/) || ($string =~ /Sharon Brown/))
This could be written as follows
if ($string =~ /(Martin|Sharon) Brown/)
Групповое соответствие
С точки зрения регулярных выражений между ними нет никакой разницы, за исключением, пожалуй, того, что первое немного яснее.
$string =~ /(\S+)\s+(\S+)/;
and
$string =~ /\S+\s+\S+/;
Однако преимущество группировки в том, что она позволяет нам извлекать последовательность из регулярного выражения. Группы возвращаются в виде списка в том порядке, в котором они появляются в оригинале. Например, в следующем фрагменте мы вытащили часы, минуты и секунды из строки.
my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);
Помимо этого прямого метода, совпадающие группы также доступны в специальных переменных $ x, где x - номер группы в регулярном выражении. Поэтому мы могли бы переписать предыдущий пример следующим образом:
#!/usr/bin/perl
$time = "12:05:30";
$time =~ m/(\d+):(\d+):(\d+)/;
my ($hours, $minutes, $seconds) = ($1, $2, $3);
print "Hours : $hours, Minutes: $minutes, Second: $seconds\n";
Когда вышеуказанная программа выполняется, она дает следующий результат -
Hours : 12, Minutes: 05, Second: 30
Когда группы используются в выражениях подстановки, синтаксис $ x может использоваться в тексте замены. Таким образом, мы могли переформатировать строку даты, используя это -
#!/usr/bin/perl
$date = '03/26/1999';
$date =~ s#(\d+)/(\d+)/(\d+)#$3/$1/$2#;
print "$date\n";
Когда вышеуказанная программа выполняется, она дает следующий результат -
1999/03/26
Утверждение \ G
Утверждение \ G позволяет продолжить поиск с того места, где произошло последнее совпадение. Например, в следующем коде мы использовали \ G, чтобы мы могли искать в правильной позиции и затем извлекать некоторую информацию без необходимости создавать более сложное единое регулярное выражение:
#!/usr/bin/perl
$string = "The time is: 12:31:02 on 4/12/00";
$string =~ /:\s+/g;
($time) = ($string =~ /\G(\d+:\d+:\d+)/);
$string =~ /.+\s+/g;
($date) = ($string =~ m{\G(\d+/\d+/\d+)});
print "Time: $time, Date: $date\n";
Когда вышеуказанная программа выполняется, она дает следующий результат -
Time: 12:31:02, Date: 4/12/00
Утверждение \ G на самом деле является просто эквивалентом метасимвола функции pos, поэтому между вызовами регулярного выражения вы можете продолжать использовать pos и даже изменять значение pos (и, следовательно, \ G), используя pos в качестве подпрограммы lvalue.
Примеры регулярных выражений
Буквальные символы
Sr.No. | Пример и описание |
---|---|
1 | Perl Матч "Perl". |
Классы персонажей
Sr.No. | Пример и описание |
---|---|
1 | [Pp]ython Соответствует "Python" или "python" |
2 | rub[ye] Соответствует «рубин» или «рубин». |
3 | [aeiou] Соответствует любой гласной в нижнем регистре |
4 | [0-9] Соответствует любой цифре; то же, что и [0123456789] |
5 | [a-z] Соответствует любой строчной букве ASCII |
6 | [A-Z] Соответствует любой заглавной букве ASCII |
7 | [a-zA-Z0-9] Соответствует любому из вышеперечисленных |
8 | [^aeiou] Соответствует чему-либо, кроме гласной строчной буквы |
9 | [^0-9] Соответствует чему-либо, кроме цифры |
Специальные классы символов
Sr.No. | Пример и описание |
---|---|
1 | . Соответствует любому символу кроме новой строки |
2 | \d Соответствует цифре: [0-9] |
3 | \D Соответствует нецифровой: [^ 0-9] |
4 | \s Соответствует пробельному символу: [\ t \ r \ n \ f] |
5 | \S Соответствует пробелам: [^ \ t \ r \ n \ f] |
6 | \w Соответствует символу из одного слова: [A-Za-z0-9_] |
7 | \W Соответствует символу, не являющемуся словом: [^ A-Za-z0-9_] |
Случаи повторения
Sr.No. | Пример и описание |
---|---|
1 | ruby? Соответствует "rub" или "ruby": y необязательно |
2 | ruby* Соответствует "руб" плюс 0 или более лет |
3 | ruby+ Соответствует "руб" плюс 1 или более лет |
4 | \d{3} Соответствует ровно 3 цифрам |
5 | \d{3,} Соответствует 3 или более цифрам |
6. | \d{3,5} Соответствует 3, 4 или 5 цифрам |
Безжалостное повторение
Это соответствует наименьшему количеству повторений -
Sr.No. | Пример и описание |
---|---|
1 | <.*> Жадное повторение: соответствует "<python> perl>" |
2 | <.*?> Nongreedy: соответствует "<python>" в "<python> perl>" |
Группировка с круглыми скобками
Sr.No. | Пример и описание |
---|---|
1 | \D\d+ Нет группы: + повторяет \ d |
2 | (\D\d)+ Сгруппировано: + повторяет пару \ D \ d |
3 | ([Pp]ython(, )?)+ Соответствие «Python», «Python, python, python» и т. Д. |
Обратные ссылки
Это снова соответствует ранее подобранной группе -
Sr.No. | Пример и описание |
---|---|
1 | ([Pp])ython&\1ails Соответствует python & pails или Python & Pails |
2 | (['"])[^\1]*\1 Строка в одинарных или двойных кавычках. \ 1 соответствует тому, что соответствует первой группе. \ 2 соответствует тому, что соответствует второй группе и т. Д. |
Альтернативы
Sr.No. | Пример и описание |
---|---|
1 | python|perl Соответствует "python" или "perl" |
2 | rub(y|le)) Спички «рубин» или «рубль» |
3 | Python(!+|\?) "Python", за которым следует один или несколько! или один? |
Якоря
Для этого нужно указать позиции совпадения.
Sr.No. | Пример и описание |
---|---|
1 | ^Python Соответствует "Python" в начале строки или внутренней строки. |
2 | Python$ Соответствует "Python" в конце строки или строки. |
3 | \APython Соответствует "Python" в начале строки |
4 | Python\Z Соответствует "Python" в конце строки. |
5 | \bPython\b Соответствует "Python" на границе слова |
6 | \brub\B \ B не является границей слова: сопоставьте «rub» с «rube» и «ruby», но не только |
7 | Python(?=!) Соответствует "Python", если после него стоит восклицательный знак. |
8 | Python(?!!) Соответствует "Python", если за ним не стоит восклицательный знак. |
Специальный синтаксис с круглыми скобками
Sr.No. | Пример и описание |
---|---|
1 | R(?#comment) Матчи «Р». Все остальное - комментарий |
2 | R(?i)uby Без учета регистра при сопоставлении "uby" |
3 | R(?i:uby) То же, что и выше |
4 | rub(?:y|le)) Группировать только без создания обратной ссылки \ 1 |