Регулярные выражения в python

Common Problems¶

Regular expressions are a powerful tool for some applications, but in some ways
their behaviour isn’t intuitive and at times they don’t behave the way you may
expect them to. This section will point out some of the most common pitfalls.

Use String Methods

Sometimes using the module is a mistake. If you’re matching a fixed
string, or a single character class, and you’re not using any features
such as the flag, then the full power of regular expressions
may not be required. Strings have several methods for performing operations with
fixed strings and they’re usually much faster, because the implementation is a
single small C loop that’s been optimized for the purpose, instead of the large,
more generalized regular expression engine.

One example might be replacing a single fixed string with another one; for
example, you might replace with . seems like the
function to use for this, but consider the method. Note that
will also replace inside words, turning
into , but the naive RE would have done that, too. (To
avoid performing the substitution on parts of words, the pattern would have to
be , in order to require that have a word boundary on
either side. This takes the job beyond ’s abilities.)

Another common task is deleting every occurrence of a single character from a
string or replacing it with another single character. You might do this with
something like , but is capable of
doing both tasks and will be faster than any regular expression operation can
be.

In short, before turning to the module, consider whether your problem
can be solved with a faster and simpler string method.

match() versus search()

The function only checks if the RE matches at the beginning of the
string while will scan forward through the string for a match.
It’s important to keep this distinction in mind. Remember, will
only report a successful match which will start at 0; if the match wouldn’t
start at zero, will not report it.

>>> print(re.match('super', 'superstition').span())
(0, 5)
>>> print(re.match('super', 'insuperable'))
None

On the other hand, will scan forward through the string,
reporting the first match it finds.

>>> print(re.search('super', 'superstition').span())
(0, 5)
>>> print(re.search('super', 'insuperable').span())
(2, 7)

Sometimes you’ll be tempted to keep using , and just add
to the front of your RE. Resist this temptation and use
instead. The regular expression compiler does some analysis of REs in order to
speed up the process of looking for a match. One such analysis figures out what
the first character of a match must be; for example, a pattern starting with
must match starting with a . The analysis lets the engine
quickly scan through the string looking for the starting character, only trying
the full match if a is found.

Adding defeats this optimization, requiring scanning to the end of the
string and then backtracking to find a match for the rest of the RE. Use
instead.

Greedy versus Non-Greedy

When repeating a regular expression, as in , the resulting action is to
consume as much of the pattern as possible. This fact often bites you when
you’re trying to match a pair of balanced delimiters, such as the angle brackets
surrounding an HTML tag. The naive pattern for matching a single HTML tag
doesn’t work because of the greedy nature of .

>>> s = '<html><head><title>Title</title>'
>>> len(s)
32
>>> print(re.match('<.*>', s).span())
(0, 32)
>>> print(re.match('<.*>', s).group())
<html><head><title>Title</title>

The RE matches the in , and the consumes the rest of
the string. There’s still more left in the RE, though, and the can’t
match at the end of the string, so the regular expression engine has to
backtrack character by character until it finds a match for the . The
final match extends from the in to the in
, which isn’t what you want.

In this case, the solution is to use the non-greedy qualifiers , ,
, or , which match as little text as possible. In the above
example, the is tried immediately after the first matches, and
when it fails, the engine advances a character at a time, retrying the
at every step. This produces just the right result:

>>> print(re.match('<.*?>', s).group())
<html>

(Note that parsing HTML or XML with regular expressions is painful.
Quick-and-dirty patterns will handle common cases, but HTML and XML have special
cases that will break the obvious regular expression; by the time you’ve written
a regular expression that handles all of the possible cases, the patterns will
be very complicated. Use an HTML or XML parser module for such tasks.)

Наиболее распространенный синтаксис и шаблоны регулярных выражений

Теперь, когда вы знаете как пользоваться модулем re, давайте рассмотрим некоторые обычно используемые шаблоны подстановок.

Основной синтаксис

. Один символ кроме новой строки
\. Просто точка , обратный слеш убирает магию всех специальных символов.
\d Одна цифра
\D Один символ кроме цифры
\w Один буквенный символ, включая цифры
\W Один символ кроме буквы и цифры
\s Один пробельный (включая таб и перенос строки)
\S Один не пробельный символ
\b Границы слова
\n Новая строка
\t Табуляция

Модификаторы

$ Конец строки
^ Начало строки
ab|cd Соответствует ab или de.
Один символ: a, b, c, d
Любой символ, кроме: a, b, c, d
() Извлечение элементов в скобках
(a(bc)) Извлечение элементов в скобках второго уровня

Повторы

{2} 2 непрерывных появления a или b
{2,5} от 2 до 5 непрерывных появления a или b
{2,} 2 и больше непрерывных появления a или b
+ одно или больше
* 0 или больше
? 0 или 1

Modifying Strings¶

Up to this point, we’ve simply performed searches against a static string.
Regular expressions are also commonly used to modify strings in various ways,
using the following pattern methods:

Method/Attribute

Purpose

Split the string into a list, splitting it
wherever the RE matches

Find all substrings where the RE matches, and
replace them with a different string

Does the same thing as , but
returns the new string and the number of
replacements

Splitting Strings

The method of a pattern splits a string apart
wherever the RE matches, returning a list of the pieces. It’s similar to the
method of strings but provides much more generality in the
delimiters that you can split by; string only supports splitting by
whitespace or by a fixed string. As you’d expect, there’s a module-level
function, too.

(string, maxsplit=0)

Split string by the matches of the regular expression. If capturing
parentheses are used in the RE, then their contents will also be returned as
part of the resulting list. If maxsplit is nonzero, at most maxsplit splits
are performed.

You can limit the number of splits made, by passing a value for maxsplit.
When maxsplit is nonzero, at most maxsplit splits will be made, and the
remainder of the string is returned as the final element of the list. In the
following example, the delimiter is any sequence of non-alphanumeric characters.

>>> p = re.compile(r'\W+')
>>> p.split('This is a test, short and sweet, of split().')

>>> p.split('This is a test, short and sweet, of split().', 3)

Sometimes you’re not only interested in what the text between delimiters is, but
also need to know what the delimiter was. If capturing parentheses are used in
the RE, then their values are also returned as part of the list. Compare the
following calls:

>>> p = re.compile(r'\W+')
>>> p2 = re.compile(r'(\W+)')
>>> p.split('This... is a test.')

>>> p2.split('This... is a test.')

The module-level function adds the RE to be used as the first
argument, but is otherwise the same.

>>> re.split(r'+', 'Words, words, words.')

>>> re.split(r'(+)', 'Words, words, words.')

>>> re.split(r'+', 'Words, words, words.', 1)

Методы объекта сопоставления Match:

Метод возвращает строку, полученную путем подстановки обратной косой черты в шаблоне строки регулярного выражения, как это сделано методом sub(). Экранированные символы, такие как , преобразуются в соответствующие символы, а числовые обратные ссылки (, ) и именованные обратные ссылки (, ) заменяются содержимым соответствующей группы.

Метод возвращает одну или несколько подгрупп совпадения. При наличии одного аргумента результатом будет одна строка, при наличии нескольких аргументов результатом будет кортеж с одним элементом на аргумент. Без аргументов группа 1 по умолчанию равна нулю — возвращается все совпадение.

  • Если аргумент равен нулю, то соответствующее возвращаемое значение является всей соответствующей строкой;
  • Если номер группы находится в инклюзивном диапазоне , это строка, соответствующая соответствующей группе скобок.
  • Если номер группы отрицателен или больше, чем число групп, определенных в шаблоне, возникает исключение IndexError.
  • Если группа содержится в части шаблона, которая не соответствует, то соответствующий результат — .
  • Если группа содержится в части шаблона, которая совпала несколько раз, возвращается последнее совпадение.
>>> import re
>>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist")

# Совпадение со всем шаблоном
>>> m.group()
# 'Isaac Newton'

# Первая группа
>>> m.group(1)
# 'Isaac'

# Вторая группа
>>> m.group(2)
# 'Newton'

# Можно указывать несколько групп
>>> m.group(1, 2)
# ('Isaac', 'Newton')

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

Умеренно сложный пример:

>>> import re
>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
>>> m.group('first_name')
# 'Malcolm'
>>> m.group('last_name')
# 'Reynolds'

На именованные группы также можно ссылаться по их индексу:

>>> m.group(1)
# 'Malcolm'
>>> m.group(2)
# 'Reynolds'

Если группа совпадает несколько раз, доступно только последнее совпадение:

>>> import re
>>> m = re.match(r"(..)+", "a1b2c3")

# 3 совпадения шаблона со строкой
>>> m.group()
# 'a1b2c3'

# для извлечения доступно только последнее
>>> m.group(1)
# 'c3'

Метод идентичен , что позволяет легче получить доступ к отдельной группе из объекта сопоставления:

>>> import re
>>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist")

# полное совпадение
>>> m
'Isaac Newton'

# Первая заключенная в скобки подгруппа.
>>> m1
# 'Isaac'

# Вторая заключенная в скобки подгруппа.
>>> m2
# 'Newton'

Метод вернет кортеж, содержащий все подгруппы совпадения, от 1 до любого количества групп в шаблоне. Аргумент используется для групп, которые не смогли захватить какой либо результат при сканировании строки и по умолчанию будут равны .

>>> import re
>>> m = re.match(r"(\d+)\.(\d+)", "24.1632")
>>> m.groups()
# ('24', '1632')

Если сделать десятичную точку и все, что после нее необязательным, то не все группы получат результат захвата. Эти группы по умолчанию будут иметь значение :

>>> import re
>>> m = re.match(r"(\d+)\.?(\d+)?", "24")

# 2 группа по умолчанию None.
>>> m.groups()
# ('24', None)

# теперь 2 группа по умолчанию '0'.
>>> m.groups('0')
# ('24', '0')

Метод возвращает словарь, содержащий все именованные подгруппы совпадения, помеченные именем подгруппы . Аргумент используется для групп, которые не смогли захватить какой либо результат при сканировании строки и по умолчанию будут равны .

>>> import re
>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
>>> m.groupdict()
# {'first_name': 'Malcolm', 'last_name': 'Reynolds'}

, :

Методы возвращают индексы начала и конца подстроки совпадающей с группой . По умолчанию группа равна нулю, имеется в виду вся совпадающая подстрока. Методы возвращают , если группа существует, но не смогла захватить какой либо результат. Для объекта сопоставления и группы , которая внесла свой вклад в сопоставление, подстрока, сопоставленная группе эквивалентная , является:

m.stringm.start(g):m.end(g)]

Обратите внимание, что будет равно , если группа соответствует нулевой строке. Например после выполнения , будет равно 1, это 2

и равны 2, а вызывает исключение .

Пример, который удалит из адресов электронной почты:

>>> email = "tony@tiremove_thisger.net"
>>> m = re.search("remove_this", email)
>>> email + emailm.end():]
# 'tony@tiger.net'

Метод вернет двойной кортеж вида

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

Как заменить один текст на другой, используя регулярные выражения?

Для изменения текста, используйте .
Рассмотрим следующую измененную версию текста курсов. Здесь добавлена табуляция после каждого кода курса.

Из вышеприведенного текста я хочу удалить все лишние пробелы и записать все слова в одну строку.

Для этого нужно просто использовать для замены шаблона на один пробел .

или

Предположим, вы хотите избавиться от лишних пробелов и выводить записи курса с новой строки. Чтобы это сделать, используйте регулярное выражение, которое пропускает символ новой строки, но учитывает все другие пробелы.

Это можно сделать, используя отрицательное соответствие . Шаблон проверяет наличие символа новой строки, в python это , и пропускает его.

Apple Music теперь официально работает в любом браузере

Шаблоны регулярных выражений

За исключением символов (+?. * ^ $ () [] {} | ), все остальные соответствуют самим себе. Вы можете избежать экранировать специальный символ с помощью бэкслеша ().

В таблицах ниже описаны все символы и комбинации символов для регулярных выражений, которые доступны в Python:

Шаблон & Описание
1 ^ — соответствует началу строки.
2 $— соответствует концу строки.
3 . — соответствует любому символу, кроме новой строки. Использование флага re.M позволяет также соответствовать новой строке.
4 — соответствует любому из символов в скобках.
5 — соответствует любому символу, кроме тех, что в квадратных скобках.
6 foo* — соответствует 0 или более вхождений “foo”.
7 bar+ —- соответствует 1 или более вхождениям “bar”.
8 foo? —- соответствует 0 или 1 вхождению “foo”.
9 bar{3} —- соответствует трем подряд вхождениям “bar”.
10 foo{3,} — соответствует 3 или более вхождениям “foo”.
11 bar{2,5} —- соответствует от 2 до 5 вхождениям “bar”.
12 a|b — соответствует либо a, либо b.
13 (foo) — группирует регулярные выражения.
14 (?imx) — временно включает параметры i, m или x в регулярное выражение. Если используются круглые скобки — затрагивается только эта область.
15 (?-imx) — временно отключает опции i, m или x в регулярном выражении. Если используются круглые скобки — затрагивается только эта область.
16 (?: foo) — Группирует регулярные выражения без сохранения совпадающего текста.
17 (?imx: re) — Временно включает параметры i, m или x в круглых скобках.
18 (?-imx: re) — временно отключает опции i, m или x в круглых скобках.
19 (?#…) — комментарий.
20 (?= foo) — совпадает со всеми словами после которых » foo».
21 (?! foo) — совпадает со всеми словами после которых нет » foo».
22 (?> foo) — совпадает со всеми словами перед которыми » foo».
23 \w — совпадает с буквенным символом.
24 \W — совпадает с не буквенным символом.
25 \s — совпадает с пробельными символами (\t, \n, \r, \f и пробелом).
26 \S — все кроме пробельных символов.
27 \d — соответствует цифрам (0-9).
28 \D — все кроме цифры.
29 \A — соответствует началу строки.
30 \Z – соответствует концу строки. Включая перевод на новую строку, если такая есть.
31 \z — соответствует концу строки.
32 \G — соответствует месту, где закончилось последнее соответствие.
33 \b — соответствует границам слов, когда поставлены внешние скобки.
34 \B — все кроме границы слова.
35 **\n,\t,\r,\f ** — соответствует новым строкам, подстрокам.
36 \1…\9 — соответствует подгруппе n-й группы.
37 \10 — соответсвуйет номеру группы. В противном случае относится к восьмеричному представлению символьного кода.

And now for something completely different

trong>Wapcaplet: (John Cleese) Welcome! Do sit down. My name’s Wapcaplet, Adrian Wapcaplet.
Mr. Simpson: how’d’y’do.
Wapcaplet: Now, Mr. Simpson… Now, I understand you want us to advertise your washing powder.
S: String.
W: String, washing powder, what’s the difference. We can sell anything.
S: Good. Well I have this large quantity of string, a hundred and twenty-two thousand miles of it to be exact, which I inherited, and I thought if I advertised it…
W: Of course! A national campaign. Useful stuff, string, no trouble there.
S: Ah, but there’s a snag, you see. Due to bad planning, the hundred and twenty-two thousand miles is in three inch lengths. So it’s not very useful.
W: Well, that’s our selling point! ‘SIMPSON’S INDIVIDUAL STRINGETTES!’
S: What?
W: ‘THE NOW STRING! READY CUT, EASY TO HANDLE, SIMPSON’S INDIVIDUAL EMPEROR STRINGETTES — JUST THE RIGHT LENGTH!’
S: For what?
W: ‘A MILLION HOUSEHOLD USES!’
S: Such as?
W: Uhmm…Tying up very small parcels, attatching notes to pigeons’ legs, uh, destroying household pests…
S: Destroying household pests?! How?
W: Well, if they’re bigger than a mouse, you can strangle them with it, and if they’re smaller than, you flog them to death with it!
S: Well surely!….
W: ‘DESTROY NINETY-NINE PERCENT OF KNOWN HOUSEHOLD PESTS WITH PRE-SLICED, RUSTPROOF, EASY-TO-HANDLE, LOW CALORIE SIMPSON’S INDIVIDUAL EMPEROR STRINGETTES, FREE FROM ARTIFICIAL COLORING, AS USED IN HOSPITALS!’

Version Operating System Description MD5 Sum File Size GPG
Gzipped source tarball Source release e19e75ec81dd04de27797bf3f9d918fd 26724009 SIG
XZ compressed source tarball Source release 6ebfe157f6e88d9eabfbaf3fa92129f6 18866140 SIG
macOS 64-bit installer Mac OS X for OS X 10.9 and later 16ca86fa3467e75bade26b8a9703c27f 31132316 SIG
Windows help file Windows 9ea6fc676f0fa3b95af3c5b3400120d6 8757017 SIG
Windows x86-64 embeddable zip file Windows for AMD64/EM64T/x64 60d0d94337ef657c2cca1d3d9a6dd94b 8387074 SIG
Windows x86-64 executable installer Windows for AMD64/EM64T/x64 b61a33dc28f13b561452f3089c87eb63 28158664 SIG
Windows x86-64 web-based installer Windows for AMD64/EM64T/x64 733df85afb160482c5636ca09b89c4c8 1364352 SIG
Windows x86 embeddable zip file Windows d81fc534080e10bb4172ad7ae3da5247 7553872 SIG
Windows x86 executable installer Windows 4a2812db8ab9f2e522c96c7728cfcccb 27066912 SIG
Windows x86 web-based installer Windows cdbfa799e6760c13d06d0c2374110aa3 1327384 SIG

Поисковые системы

Match Object

A Match Object is an object containing information
about the search and the result.

Note: If there is no match, the value will be
returned, instead of the Match Object.

Example

Do a search that will return a Match Object:

import retxt = «The rain in Spain»x = re.search(«ai»,
txt)
print(x) #this will print an object

The Match object has properties and methods used to retrieve information
about the search, and the result:

returns a tuple containing the start-, and end positions of the match. returns the string passed into the function returns the part of the string where there was a match

Example

Print the position (start- and end-position) of the first match occurrence.

The regular expression looks for any words that starts with an upper case
«S»:

import re
txt = «The rain in Spain»
x = re.search(r»\bS\w+», txt)
print(x.span())

Example

Print the string passed into the function:

import re
txt = «The rain in Spain»
x = re.search(r»\bS\w+», txt)
print(x.string)

Example

Print the part of the string where there was a match.

The regular expression looks for any words that starts with an upper case
«S»:

import re
txt = «The rain in Spain»
x = re.search(r»\bS\w+», txt)
print(x.group())

Note: If there is no match, the value will be
returned, instead of the Match Object.

❮ Previous
Next ❯

The search Function

This function searches for first occurrence of RE pattern within string with optional flags.

Here is the syntax for this function −

re.search(pattern, string, flags=0)

Here is the description of the parameters −

Sr.No. Parameter & Description
1

pattern

This is the regular expression to be matched.

2

string

This is the string, which would be searched to match the pattern anywhere in the string.

3

flags

You can specify different flags using bitwise OR (|). These are modifiers, which are listed in the table below.

The re.search function returns a match object on success, none on failure. We use group(num) or groups() function of match object to get matched expression.

Sr.No. Match Object Methods & Description
1

group(num=0)

This method returns entire match (or specific subgroup num)

2

groups()

This method returns all matching subgroups in a tuple (empty if there weren’t any)

Example

#!/usr/bin/python
import re

line = "Cats are smarter than dogs";

searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)

if searchObj:
   print "searchObj.group() : ", searchObj.group()
   print "searchObj.group(1) : ", searchObj.group(1)
   print "searchObj.group(2) : ", searchObj.group(2)
else:
   print "Nothing found!!"

When the above code is executed, it produces following result −

searchObj.group() :  Cats are smarter than dogs
searchObj.group(1) :  Cats
searchObj.group(2) :  smarter

Сложности с обратными косыми

Обратные косые немного усложняют жизнь в мире регулярных выражений Python. Это связанно с тем, что регулярные выражения используют обратные косые для определения специальных форм, или для того, чтобы искать определенный символ, вместо того, чтобы вызывать его. Как если бы мы искали символ доллара $. Если мы не используем обратную косую для этого, нам нужно просто создать анкор. Проблема возникает по той причине, что Python использует символ обратной косой по той же причине в литеральных строках.

Давайте представим, что вам нужно найти строку на подобии этой: «python». Для её поиска в регулярном выражении, вам нужно будет использовать обратную косую, но, так как Python также использует обратную косую, так что на выходе вы получите следующий поисковый паттерн: «\\python» (без скобок). К счастью, Python поддерживает сырые строки, путем подстановки буквы r перед строкой. Так что мы можем сделать выдачу более читабельной, введя следующее: r”\python”. Так что если вам нужно найти что-то с обратной косой в названии, убедитесь, что используете сырые строки для этой цели, иначе можете получить совсем не то, что ищете.

Разность re.match и re.search

re.match соответствует только начало строки, если начало строки не соответствует регулярному выражению, совпадение не найдено, функция возвращает None, и re.search совпадают со строкой, пока не найдет совпадения.

Пример:

#!/usr/bin/python3

import re

line = "Cats are smarter than dogs";

matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
   print ("match --> matchObj.group() : ", matchObj.group())
else:
   print ("No match!!")

matchObj = re.search( r'dogs', line, re.M|re.I)
if matchObj:
   print ("search --> matchObj.group() : ", matchObj.group())
else:
   print ("No match!!")
No match!!
search --> matchObj.group() :  dogs

Как пользоваться ADB run

Находим множественные совпадения

До этого момента мы научились только находить первое совпадение в строке. Но что если у вас строка, в которой содержится множество совпадений? Давайте посмотрим, как найти одно:

Python

import re

silly_string = «the cat in the hat»
pattern = «the»

match = re.search(pattern, text)
print(match.group()) # ‘the’

1
2
3
4
5
6
7

importre

silly_string=»the cat in the hat»

pattern=»the»

match=re.search(pattern,text)

print(match.group())# ‘the’

Теперь, как вы видите, у нас есть два экземпляра слова the, но нашли мы только одно. Существует два метода, чтобы найти все совпадения. Первый, который мы рассмотрим, это использование функции findall:

Python

import re

silly_string = «the cat in the hat»
pattern = «the»

a = re.findall(pattern, silly_string)
print(a) #

1
2
3
4
5
6
7

importre

silly_string=»the cat in the hat»

pattern=»the»

a=re.findall(pattern,silly_string)

print(a)#

Функция findall будет искать по всей переданной ей строке, и впишет каждое совпадение в список. По окончанию поиска вышей строки, она выдаст список совпадений. Второй способ найти несколько совпадений, это использовать функцию finditer:

Python

import re

silly_string = «the cat in the hat»
pattern = «the»

for match in re.finditer(pattern, silly_string):
s = «Found ‘{group}’ at {begin}:{end}».format(
group=match.group(), begin=match.start(),
end=match.end())

print(s)

1
2
3
4
5
6
7
8
9
10
11

importre

silly_string=»the cat in the hat»

pattern=»the»

formatch inre.finditer(pattern,silly_string)

s=»Found ‘{group}’ at {begin}:{end}».format(

group=match.group(),begin=match.start(),

end=match.end())

print(s)

Как вы могли догадаться, метод finditer возвращает итератор экземпляров Match, вместо строк, которые мы получаем от findall. Так что нам нужно немного подформатировать результаты перед их выводом. Попробуйте запустить данный код и посмотрите, как он работает.

Функция match

Эта функция ищет в и поддерживает настройки с помощью дополнительного .
Ниже можно увидеть синтаксис данной функции:

Описание параметров:

Параметр & Описание
1 pattern — строка регулярного выражения ()
2 string — строка, в которой мы будем искать соответствие с шаблоном в начале строки ()
3 flags — модификаторы, перечисленными в таблице ниже. Вы можете указать разные флаги с помощью побитового OR

Функция возвращает объект при успешном завершении, или при ошибке. Мы используем функцию или объекта для получения результатов поиска.

Метод совпадения объектов и описание
1 group(num=0) — этот метод возвращает полное совпадение (или совпадение конкретной подгруппы)
2 groups() — этот метод возвращает все найденные подгруппы в tuple

Основы синтаксиса

экранировать

Шаблоны, соответствующие одному символу

Шаблон Описание Пример Применяем к тексту
Один любой символ, кроме новой строки . молоко, малако,
Им0л0коИхлеб
Любая цифра СУ35, СУ111, АЛСУ14
Любой символ, кроме цифры 926)123, 1926-1234
Любой пробельный символ (пробел, табуляция, конец строки и т.п.) бор ода, бор
ода
, борода
Любой непробельный символ X123, я123, !123456, 1 + 123456
Любая буква (то, что может быть частью слова), а также цифры и Год, f_3, qwert
Любая не-буква, не-цифра и не подчёркивание сом!, сом?
Один из символов в скобках,
а также любой символ из диапазона
12, 1F, 4B
Любой символ, кроме перечисленных <1>, <a>, <>>
Буква “ё” не включается в общий диапазон букв!
Вообще говоря, в включается всё, что в юникоде помечено как «цифра», а в — как буква. Ещё много всего!
если нужен минус, его нужно указать последним или первым
внутри скобок нужно экранировать только и
Начало или конец слова (слева пусто или не-буква, справа буква и наоборот).
В отличие от предыдущих соответствует позиции, а не символу
вал, перевал, Перевалка
Не граница слова: либо и слева, и справа буквы,
либо и слева, и справа НЕ буквы
перевал, вал, Перевалка
перевал, вал, Перевалка

Квантификаторы (указание количества повторений)

Шаблон Описание Пример Применяем к тексту
Ровно n повторений 1, 12, 123, 1234, 12345
От m до n повторений включительно 1, 12, 123, 1234, 12345
Не менее m повторений 1, 12, 123, 1234, 12345
Не более n повторений 1, 12, 123
Ноль или одно вхождение, синоним вал, валы, валов
Ноль или более, синоним СУ, СУ1, СУ12, …
Одно или более, синоним a), a)), a))), ba)])
По умолчанию квантификаторы жадные
захватывают максимально возможное число символов.
Добавление делает их ленивыми,
они захватывают минимально возможное число символов
(a + b) * (c + d) * (e + f)(a + b) * (c + d) * (e + f)

Жадность в регулярках и границы найденного шаблона

Как указано выше, по умолчанию квантификаторы жадные. Этот подход решает очень важную проблему — проблему границы шаблона. Скажем, шаблон захватывает максимально возможное количество цифр. Поэтому можно быть уверенным, что перед найденным шаблоном идёт не цифра, и после идёт не цифра. Однако если в шаблоне есть не жадные части (например, явный текст), то подстрока может быть найдена неудачно. Например, если мы хотим найти «слова», начинающиеся на , после которой идут цифры, при помощи регулярки , то мы найдём и неправильные шаблоны:

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

Классы персонажей

примеров описание
ython Matching «Python» или «Python»
руб Матч «Рубин» или «деревенщина»
Любой из букв в скобках соответствия
Соответствует любой цифре. Аналогично
Соответствует любому строчных букв
Соответствует любой верхний регистр
Матчи любые буквы и цифры
В дополнение ко всем, кроме букв символов аеиоу
Соответствующие символы, кроме цифр

Специальные классы символов

примеров описание
, Соответствует любому одному символу, кроме «\ п» есть. Для того, чтобы соответствовать в том числе ‘\ N’, в том числе любые символы, такие, как использование » режим.
\ D Совпадает с цифрой. Эквивалент .
\ D Соответствует не цифровых символов. Это эквивалентно .
\ S Соответствует пробельные символы, включая пробелы, символы табуляции, разрывы страниц, и так далее. Эквивалентно .
\ S Соответствует непробельного символы. Эквивалентно .
\ W Любое слово символ, включая подчеркивание. Это эквивалентно » ‘.
\ W Соответствует любому символу, кроме буквы. Это эквивалентно ».

Предыдущая: python3 os.write метод ()
Далее: python3 CGI программирование

Search and Replace

One of the most important re methods that use regular expressions is sub.

Syntax

re.sub(pattern, repl, string, max=0)

This method replaces all occurrences of the RE pattern in string with repl, substituting all occurrences unless max provided. This method returns modified string.

Example

#!/usr/bin/python
import re

phone = "2004-959-559 # This is Phone Number"

# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print "Phone Num : ", num

# Remove anything other than digits
num = re.sub(r'\D', "", phone)    
print "Phone Num : ", num

When the above code is executed, it produces the following result −

Phone Num :  2004-959-559
Phone Num :  2004959559
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *