Учебники

Perl — регулярные выражения

Регулярное выражение — это строка символов, которая определяет шаблон или шаблоны, которые вы просматриваете. Синтаксис регулярных выражений в Perl очень похож на тот, который вы найдете в других программах, поддерживающих регулярные выражения, таких как sed , grep и awk .

Основной метод применения регулярного выражения — использовать операторы привязки к шаблону = ~ и ! ~. Первый оператор — это оператор тестирования и присваивания.

В Perl есть три оператора регулярных выражений.

  • Соответствие регулярному выражению — m //
  • Заменить регулярное выражение — s ///
  • Транслитерационное регулярное выражение — tr ///

Прямая косая черта в каждом случае действует как разделитель для заданного вами регулярного выражения (регулярное выражение). Если вас устраивает любой другой разделитель, то вы можете использовать вместо косой черты.

Оператор матча

Оператор соответствия m // используется для сопоставления строки или оператора с регулярным выражением. Например, чтобы сопоставить последовательность символов «foo» со скалярным $ bar, вы можете использовать выражение вроде этого —

Live Demo

#!/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 (в скалярном контексте), если выражение соответствует. Поэтому утверждение —

$true = ($foo =~ m/foo/);

установит $ true в 1, если $ foo соответствует регулярному выражению, или 0, если совпадение не удастся. В контексте списка совпадение возвращает содержимое любых сгруппированных выражений. Например, при извлечении часов, минут и секунд из строки времени мы можем использовать —

my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);

Модификаторы Оператора Матча

Оператор соответствия поддерживает свой собственный набор модификаторов. Модификатор / g допускает глобальное сопоставление. Модификатор / i сделает регистр нечувствительным к регистру. Вот полный список модификаторов

Sr.No. Модификатор и описание
1

я

Делает регистр нечувствительным к регистру.

2

м

Указывает, что если строка содержит символы новой строки или возврата каретки, операторы ^ и $ теперь будут сопоставляться с границей новой строки вместо границы строки.

3

о

Оценивает выражение только один раз.

4

s

Позволяет использовать. соответствовать символу новой строки.

5

Икс

Позволяет вам использовать пробел в выражении для ясности.

6

г

Глобально находит все совпадения.

7

CG

Позволяет продолжить поиск даже после сбоя глобального сопоставления.

я

Делает регистр нечувствительным к регистру.

м

Указывает, что если строка содержит символы новой строки или возврата каретки, операторы ^ и $ теперь будут сопоставляться с границей новой строки вместо границы строки.

о

Оценивает выражение только один раз.

s

Позволяет использовать. соответствовать символу новой строки.

Икс

Позволяет вам использовать пробел в выражении для ясности.

г

Глобально находит все совпадения.

CG

Позволяет продолжить поиск даже после сбоя глобального сопоставления.

Соответствует только один раз

Существует также более простая версия оператора сопоставления — «PATTERN». оператор. Это в основном идентично оператору m //, за исключением того, что оно совпадает только один раз в строке, которую вы ищете между каждым вызовом reset.

Например, вы можете использовать это, чтобы получить первый и последний элементы в списке —

Live Demo

#!/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

Переменные регулярного выражения

Переменные регулярного выражения включают в себя $ , который содержит все совпадения последнего совпадения группировки; $ & , который содержит всю совпавшую строку; $ ` , который содержит все перед соответствующей строкой; и $ ‘ , который содержит все после соответствующей строки. Следующий код демонстрирует результат —

Live Demo

#!/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/;

PATTERN — это регулярное выражение для текста, который мы ищем. REPLACEMENT — это спецификация для текста или регулярного выражения, которую мы хотим использовать для замены найденного текста. Например, мы можем заменить все вхождения собаки на кошку, используя следующее регулярное выражение —

Live Demo

#/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

я

Делает регистр нечувствительным к регистру.

2

м

Указывает, что если строка содержит символы новой строки или возврата каретки, операторы ^ и $ теперь будут сопоставляться с границей новой строки вместо границы строки.

3

о

Оценивает выражение только один раз.

4

s

Позволяет использовать. соответствовать символу новой строки.

5

Икс

Позволяет вам использовать пробел в выражении для ясности.

6

г

Заменяет все вхождения найденного выражения текстом замены.

7

е

Оценивает замену, как если бы это был оператор Perl, и использует возвращаемое значение в качестве текста замены.

я

Делает регистр нечувствительным к регистру.

м

Указывает, что если строка содержит символы новой строки или возврата каретки, операторы ^ и $ теперь будут сопоставляться с границей новой строки вместо границы строки.

о

Оценивает выражение только один раз.

s

Позволяет использовать. соответствовать символу новой строки.

Икс

Позволяет вам использовать пробел в выражении для ясности.

г

Заменяет все вхождения найденного выражения текстом замены.

е

Оценивает замену, как если бы это был оператор Perl, и использует возвращаемое значение в качестве текста замены.

Оператор перевода

Перевод аналогичен, но не идентичен принципам замещения, но в отличие от замещения, перевод (или транслитерация) не использует регулярные выражения для поиска значений замены. Операторы перевода —

tr/SEARCHLIST/REPLACEMENTLIST/cds
y/SEARCHLIST/REPLACEMENTLIST/cds

Перевод заменяет все вхождения символов в SEARCHLIST на соответствующие символы в REPLACEMENTLIST. Например, используя «Кошка села на коврик». Строка, которую мы использовали в этой главе —

Live Demo

#/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

с

Дополняет ПОИСК.

2

d

Удаляет найденные, но не замененные символы.

3

s

Сквош дублирует замененные символы.

с

Дополняет ПОИСК.

d

Удаляет найденные, но не замененные символы.

s

Сквош дублирует замененные символы.

Модификатор / d удаляет символы, соответствующие SEARCHLIST, для которых нет соответствующей записи в REPLACEMENTLIST. Например —

Live Demo

#!/usr/bin/perl 

$string = 'the cat sat on the mat.';
$string =~ tr/a-z/b/d;

print "$string\n";

Когда вышеуказанная программа выполняется, она дает следующий результат —

b b   b.

Последний модификатор, / s, удаляет повторяющиеся последовательности символов, которые были заменены, поэтому —

Live Demo

#!/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}

Совпадает ровно с числом вхождений предыдущего выражения.

10

{п,}

Соответствует n или более вхождений предыдущего выражения.

11

{п, м}

Соответствует не менее n и не более m вхождений предшествующего выражения.

12

| б

Соответствует либо a, либо b.

13

\ ш

Соответствует символам слова.

14

\ W

Соответствует несловесным персонажам.

15

\ s

Соответствует пробелу. Эквивалентно [\ t \ n \ r \ f].

16

\ S

Соответствует непробельному пространству.

17

\ d

Соответствует цифрам. Эквивалентно [0-9].

18

\ D

Соответствует нецифровым значениям.

19

\ A

Соответствует началу строки.

20

\ Z

Соответствует концу строки. Если новая строка существует, она совпадает непосредственно перед новой строкой.

21

\ г

Соответствует концу строки.

22

Точки совпадений, где последний матч закончился.

23

\ б

Соответствует границам слов, когда они выходят за скобки. Соответствует Backspace (0x08) внутри скобок.

24

\ B

Соответствует безсловным границам.

25

\ n, \ t и т. д.

Сопоставляет переводы строк, возврат каретки, вкладки и т. Д.

26

\ 1 … \ 9

Соответствует n-му сгруппированному подвыражению.

27

\ 10

Соответствует n-му сгруппированному подвыражению, если оно уже найдено. В противном случае относится к восьмеричному представлению кода символа.

28

[AEIOU]

Соответствует одному символу в данном наборе

29

[^ AEIOU]

Соответствует одному символу за пределами данного набора

^

Соответствует началу строки.

$

Соответствует концу строки.

,

Соответствует любому отдельному символу, кроме новой строки. Использование опции m позволяет ему соответствовать новой строке.

[…]

Соответствует любому отдельному символу в скобках.

[^ …]

Соответствует любому отдельному символу не в скобках.

*

Соответствует 0 или более вхождений предыдущего выражения.

+

Соответствует 1 или более вхождению предыдущего выражения.

?

Соответствует 0 или 1 вхождению предыдущего выражения.

{n}

Совпадает ровно с числом вхождений предыдущего выражения.

{п,}

Соответствует n или более вхождений предыдущего выражения.

{п, м}

Соответствует не менее n и не более m вхождений предшествующего выражения.

| б

Соответствует либо a, либо b.

\ ш

Соответствует символам слова.

\ W

Соответствует несловесным персонажам.

\ s

Соответствует пробелу. Эквивалентно [\ t \ n \ r \ f].

\ S

Соответствует непробельному пространству.

\ d

Соответствует цифрам. Эквивалентно [0-9].

\ D

Соответствует нецифровым значениям.

\ A

Соответствует началу строки.

\ Z

Соответствует концу строки. Если новая строка существует, она совпадает непосредственно перед новой строкой.

\ г

Соответствует концу строки.

Точки совпадений, где последний матч закончился.

\ б

Соответствует границам слов, когда они выходят за скобки. Соответствует Backspace (0x08) внутри скобок.

\ B

Соответствует безсловным границам.

\ n, \ t и т. д.

Сопоставляет переводы строк, возврат каретки, вкладки и т. Д.

\ 1 … \ 9

Соответствует n-му сгруппированному подвыражению.

\ 10

Соответствует n-му сгруппированному подвыражению, если оно уже найдено. В противном случае относится к восьмеричному представлению кода символа.

[AEIOU]

Соответствует одному символу в данном наборе

[^ 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+$/

Давайте посмотрим на другой пример.

Live Demo

#!/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 — номер группы в регулярном выражении. Поэтому мы могли бы переписать предыдущий пример следующим образом:

Live Demo

#!/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. Таким образом, мы могли бы переформатировать строку даты, используя это —

Live Demo

#!/usr/bin/perl

$date = '03/26/1999';
$date =~ s#(\d+)/(\d+)/(\d+)#$3/$1/$2#;

print "$date\n";

Когда вышеуказанная программа выполняется, она дает следующий результат —

1999/03/26

Утверждение \ G

Утверждение \ G позволяет вам продолжить поиск с того места, где произошло последнее совпадение. Например, в следующем коде мы использовали \ G, чтобы мы могли искать в правильной позиции и затем извлекать некоторую информацию, не создавая более сложного единственного регулярного выражения —

Live Demo

#!/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

[Рр] ython

Соответствует «Python» или «Python»

2

руб [вы]

Совпадает «рубин» или «рубин»

3

[AEIOU]

Соответствует любой строчной гласной

4

[0-9]

Соответствует любой цифре; такой же как [0123456789]

5

[AZ]

Соответствует любой строчной букве ASCII

6

[AZ]

Соответствует любой прописной букве ASCII

7

[A-Za-Z0-9]

Соответствует любому из вышеперечисленного

8

[^ AEIOU]

Совпадает с чем угодно, кроме строчной гласной

9

[^ 0-9]

Совпадает с чем угодно, кроме цифры

[Рр] ython

Соответствует «Python» или «Python»

руб [вы]

Совпадает «рубин» или «рубин»

[AEIOU]

Соответствует любой строчной гласной

[0-9]

Соответствует любой цифре; такой же как [0123456789]

[AZ]

Соответствует любой строчной букве ASCII

[AZ]

Соответствует любой прописной букве ASCII

[A-Za-Z0-9]

Соответствует любому из вышеперечисленного

[^ AEIOU]

Совпадает с чем угодно, кроме строчной гласной

[^ 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

\ ш

Соответствует отдельному слову: [A-Za-z0-9_]

7

\ W

Соответствует несловесному символу: [^ A-Za-z0-9_]

,

Соответствует любому символу, кроме новой строки

\ d

Соответствует цифре: [0-9]

\ D

Совпадает с нецифровой цифрой: [^ 0-9]

\ s

Соответствует пробелу: [\ t \ r \ n \ f]

\ S

Совпадает с незаполненными пробелами: [^ \ t \ r \ n \ f]

\ ш

Соответствует отдельному слову: [A-Za-z0-9_]

\ W

Соответствует несловесному символу: [^ A-Za-z0-9_]

Случаи повторения

Sr.No. Пример и описание
1

Рубин?

Совпадает с «rub» или «ruby»: y является необязательным

2

Рубин*

Совпадения «руб» плюс 0 или более лет

3

рубин +

Совпадения «руб» плюс 1 или более лет

4

\ д {3}

Точно соответствует 3 цифрам

5

\ д {3}

Соответствует 3 или более цифрам

6.

\ д {3,5}

Соответствует 3, 4 или 5 цифрам

Рубин?

Совпадает с «rub» или «ruby»: y является необязательным

Рубин*

Совпадения «руб» плюс 0 или более лет

рубин +

Совпадения «руб» плюс 1 или более лет

\ д {3}

Точно соответствует 3 цифрам

\ д {3}

Соответствует 3 или более цифрам

\ д {3,5}

Соответствует 3, 4 или 5 цифрам

Нечестивое Повторение

Это соответствует наименьшему количеству повторений —

Sr.No. Пример и описание
1

<. *>

Жадное повторение: соответствует «<python> perl>»

2

<. *?>

Nongreedy: соответствует «<python>» в «<python> perl>»

<. *>

Жадное повторение: соответствует «<python> perl>»

<. *?>

Nongreedy: соответствует «<python>» в «<python> perl>»

Группировка с круглыми скобками

Sr.No. Пример и описание
1

\ D \ D +

Нет группы: + повторяется \ d

2

(\ D \ d) +

Сгруппировано: + повторяет \ D \ d пару

3

([Pp] ython (,)?) +

Совпадение «Питон», «Питон, питон, питон» и т. Д.

\ D \ D +

Нет группы: + повторяется \ d

(\ D \ d) +

Сгруппировано: + повторяет \ D \ d пару

([Pp] ython (,)?) +

Совпадение «Питон», «Питон, питон, питон» и т. Д.

Обратные

Это снова соответствует ранее подобранной группе —

Sr.No. Пример и описание
1

([Рр]) ython & \ 1ails

Соответствует питону и ведрам или питону и ведрам

2

([ ‘ «]) [^ \ 1] * \ 1

Строка в одинарных или двойных кавычках. \ 1 соответствует любому совпадению 1-й группы. \ 2 соответствует любому совпадению 2-й группы и т. Д.

([Рр]) ython & \ 1ails

Соответствует питону и ведрам или питону и ведрам

([ ‘ «]) [^ \ 1] * \ 1

Строка в одинарных или двойных кавычках. \ 1 соответствует любому совпадению 1-й группы. \ 2 соответствует любому совпадению 2-й группы и т. Д.

альтернативы

Sr.No. Пример и описание
1

питон | Perl

Соответствует «python» или «perl»

2

руб (у | ль))

Совпадает «рубин» или «рубль»

3

Python (+ |!? \)

«Питон», за которым следует один или несколько! или один?

питон | Perl

Соответствует «python» или «perl»

руб (у | ль))

Совпадает «рубин» или «рубль»

Python (+ |!? \)

«Питон», за которым следует один или несколько! или один?

Якоря

Для этого нужно указать совпадающие позиции.

^ Python

Соответствует «Python» в начале строки или внутренней строки

Python $

Соответствует «Python» в конце строки или строки

\ APython

Соответствует «Python» в начале строки

Python \ Z

Соответствует «Python» в конце строки

\ bPython \ б

Соответствует «Python» на границе слова

\ brub \ B

\ B является границей без слов: соответствует «rub» в «rube» и «ruby», но не в одиночку

Python (?! =)

Соответствует «Python», если после него стоит восклицательный знак

Python (? !!)

Соответствует «Python», если после него не стоит восклицательный знак

R (? # Комментарий)

Спички «R». Все остальное — комментарий

R (? Я) убий

Учитывает регистр при сопоставлении «uby»

R (I: убий)

То же, что и выше

руб: |) (у ля?)

Группировать только без создания \ 1 обратной ссылки