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

Major new features of the 3.9 series, compared to 3.8

Some of the new major new features and changes in Python 3.9 are:

  • PEP 573, Module State Access from C Extension Methods
  • PEP 584, Union Operators in
  • PEP 585, Type Hinting Generics In Standard Collections
  • PEP 593, Flexible function and variable annotations
  • PEP 602, Python adopts a stable annual release cadence
  • PEP 614, Relaxing Grammar Restrictions On Decorators
  • PEP 615, Support for the IANA Time Zone Database in the Standard Library
  • PEP 616, String methods to remove prefixes and suffixes
  • PEP 617, New PEG parser for CPython
  • BPO 38379, garbage collection does not block on resurrected objects;
  • BPO 38692, os.pidfd_open added that allows process management without races and signals;
  • BPO 39926, Unicode support updated to version 13.0.0;
  • BPO 1635741, when Python is initialized multiple times in the same process, it does not leak memory anymore;
  • A number of Python builtins (range, tuple, set, frozenset, list, dict) are now sped up using PEP 590 vectorcall;
  • A number of Python modules (_abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time, _weakref) now use multiphase initialization as defined by PEP 489;
  • A number of standard library modules (audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios, zlib) are now using the stable ABI defined by PEP 384.

You can find a more comprehensive list in this release’s «What’s New» document.

Примеры точка Regex.

Давайте изучим некоторые основные примеры, чтобы получить более глубокое понимание.

>>> import re
>>> 
>>> text = '''But then I saw no harm, and then I heard
Each syllable that breath made up between them.'''
>>> re.findall('B..', text)

>>> re.findall('heard.Each', text)
[]
>>> re.findall('heard\nEach', text)

>>> 

Вы сначала импортируете библиотеку Python Re для регулярного обращения с выражением. Затем вы создаете многострочный текст, используя цитаты Triple String.

Давайте погрузимся в первый пример:

>>> re.findall('B..', text)

Вы используете метод. Вот определение из Блог Finxter :

То Re.findall (шаблон, строка) Метод находит все вхождения шаблон в нить и возвращает список всех подходящих подстрок.

Пожалуйста, обратитесь к статью в блоге, чтобы узнать все, что вам нужно знать об этом фундаментальном методе Python.

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

Метод находит только одно такое происшествие: строка Отказ

Второй пример показывает, что оператор DOT не соответствует символу Newline:

>>> re.findall('heard.Each', text)
[]

В этом примере вы смотрите на простой шаблон Отказ Вы хотите найти все вхождения строки сопровождаемый произвольным небетоносным характером, а затем строку Отказ

Но такой узор не существует! Многие кодеры интуитивно читают точечное регулярное выражение как произвольный характер . Вы должны знать, что правильное определение Dot Regex – это произвольный характер, кроме новой строки Отказ Это источник многих ошибок в регулярных выражениях.

Третий пример показывает, как явно соответствовать символу новой строки вместо:

>>> re.findall('heard\nEach', text)

Теперь двигатель Regex соответствует подстроке.

Естественно, возникает следующий актуальный вопрос:

re.match функция

re.match пытается сопоставить шаблон из исходного положения строки, если не согласующий стартовая позиция является успешным, матч () не возвращает ничего.

Синтаксис функции:

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

Параметры функции:

параметры описание
шаблон Матч регулярное выражение
строка Строка для соответствия.
флаги Флаг, регулярное выражение соответствия используется для управления, например: соответствует ли чувствительны к регистру, многострочный, и так далее.

Успешный метод матча re.match возвращает объект соответствия, в противном случае None.

Мы можем использовать эту группу (NUM) или группы () функцию, чтобы получить объекты, соответствующие выражения совпадают.

Соответствующие методы объекта описание
группа (Num = 0) Весь соответствующий строковое выражение, группа () может ввести более одного номера группы, в этом случае он будет возвращать значение, соответствующее этим группам кортежей.
группы () Он возвращает кортеж из всех групп строки, от 1 до количества, содержащегося в группе.

Пример 1:

#!/usr/bin/python
# -*- coding: UTF-8 -*- 

import re
print(re.match('www', 'www.w3big.com').span())  # 在起始位置匹配
print(re.match('com', 'www.w3big.com'))         # 不在起始位置匹配

Запуск в приведенном выше примере выход:

(0, 3)
None

Пример 2:

#!/usr/bin/python3
import re

line = "Cats are smarter than dogs"

matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)

if matchObj:
   print ("matchObj.group() : ", matchObj.group())
   print ("matchObj.group(1) : ", matchObj.group(1))
   print ("matchObj.group(2) : ", matchObj.group(2))
else:
   print ("No match!!")

Результаты приведенных выше примерах, являются следующими:

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

Как сопоставить точечный персонаж (без особого значения)?

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

Ничего проще, чем это: избежать точечного регулятора, используя обратную косание: Отказ Обратная черта не обнаруживает значение специального символа в Regex. Двигатель Regex теперь знает, что вы на самом деле ищете точечный персонаж, а не произвольный символ, кроме новой строки.

Вот пример:

>>> import re
>>> text = 'Python. Is. Great. Period.'
>>> re.findall('\.', text)

Метод возвращает все четыре периода в предложении в качестве сопоставления подстроки для Regex Отказ

В этом примере вы узнаете, как вы можете объединить его с другими регулярными выражениями:

>>> re.findall('\.\s', text)

Теперь вы ищете период срока, а затем произвольный пробел. В тексте только три таких соответствующих подстроки.

В следующем примере вы узнаете, как объединить это с классом персонажа:

>>> re.findall('\.', text)

Вы хотите найти либо персонаж или характер сопровождается символом периода . Две подстроки соответствуют этому Regex.

Обратите внимание, что пропуская обратная косание требуется. Если вы забудете это, это может привести к странному поведению:

>>> re.findall('.', text)

Как произвольный символ разрешен после класса персонажа, подстрока также соответствует Regex.

Special Sequences

A special sequence is a followed by one of the characters in the list below, and has a special meaning:

Character Description Example Try it
\A Returns a match if the specified characters are at the beginning of the
string
«\AThe» Try it »
\b Returns a match where the specified characters are at the beginning or at the
end of a word(the «r» in the beginning is making sure that the string is
being treated as a «raw string»)
r»\bain»r»ain\b» Try it »Try it »
\B Returns a match where the specified characters are present, but NOT at the beginning
(or at
the end) of a word(the «r» in the beginning is making sure that the string
is being treated as a «raw string»)
r»\Bain»r»ain\B» Try it »Try it »
\d Returns a match where the string contains digits (numbers from 0-9) «\d» Try it »
\D Returns a match where the string DOES NOT contain digits «\D» Try it »
\s Returns a match where the string contains a white space character «\s» Try it »
\S Returns a match where the string DOES NOT contain a white space character «\S» Try it »
\w Returns a match where the string contains any word characters (characters from
a to Z, digits from 0-9, and the underscore _ character)
«\w» Try it »
\W Returns a match where the string DOES NOT contain any word characters «\W» Try it »
\Z Returns a match if the specified characters are at the end of the string «Spain\Z» Try it »

Major new features of the 3.8 series, compared to 3.7

  • PEP 572, Assignment expressions
  • PEP 570, Positional-only arguments
  • PEP 587, Python Initialization Configuration (improved embedding)
  • PEP 590, Vectorcall: a fast calling protocol for CPython
  • PEP 578, Runtime audit hooks
  • PEP 574, Pickle protocol 5 with out-of-band data
  • Typing-related: PEP 591 (Final qualifier), PEP 586 (Literal types), and PEP 589 (TypedDict)
  • Parallel filesystem cache for compiled bytecode
  • Debug builds share ABI as release builds
  • f-strings support a handy specifier for debugging
  • is now legal in blocks
  • on Windows, the default event loop is now
  • on macOS, the spawn start method is now used by default in
  • can now use shared memory segments to avoid pickling costs between processes
  • is merged back to CPython
  • is now 40% faster
  • now uses Protocol 4 by default, improving performance

There are many other interesting changes, please consult the «What’s New» page in the documentation for a full list.

Методы

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

  1. re.match();
  2. исследовать();
  3. re.findall();
  4. re.split();
  5. re.sub();
  6. re.compile().

re.match(шаблон, строка, флаги = 0)

Это выражение используется для сопоставления символа или набора символов в начале строки

Также важно отметить, что это выражение будет соответствовать только в начале строки, если данная строка состоит из нескольких строк.. Выражение ниже вернет None, потому что Python не появляется в начале строки.

Выражение ниже вернет None, потому что Python не появляется в начале строки.

# match.py

import re
result = re.match(r'Python', 'It\'s  easy to learn Python. Python also has elegant syntax')

print(result)
$ python match.py
None

re.search(шаблон, строка)

Этот модуль будет проверять совпадение в любом месте заданной строки и возвращать результаты, если они найдены, и None, если они не найдены.

В следующем коде мы просто пытаемся определить, появляется ли слово «щенок» в строке «Дейзи нашла щенка».

# search.py

import re

if re.search("puppy", "Daisy found a puppy."):
    print("Puppy found")
else:
    print("No puppy")

Здесь мы сначала импортируем модуль re и используем его для поиска вхождения подстроки «щенок» в строке «Дейзи нашла щенка». Если он существует в строке, возвращается объект re.MatchObject, который считается «правдивым» при оценке в операторе if.

$ python search.py 
Puppy found

re.compile(шаблон, флаги = 0)

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

# compile.py

import re

pattern = re.compile('Python')
result = pattern.findall('Pythonistas are programmers that use Python, which is an easy-to-learn and powerful language.')

print(result)

find = pattern.findall('Python is easy to learn')

print(find)
$ python compile.py 


Обратите внимание, что возвращается только соответствующая строка, в отличие от всего слова в случае «Pythonistas». Это более полезно при использовании строки регулярного выражения, в которой есть специальные символы соответствия.

re.sub(шаблон, repl, строка)

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

# sub.py

import re
result = re.sub(r'python', 'ruby', 'python is a very easy language')

print(result)
$ python sub.py 
ruby is a very easy language

re.findall(шаблон, строка)

Как вы видели до этого раздела, этот метод находит и извлекает список всех вхождений в данной строке. Он сочетает в себе функции и свойства re.search() и re.match(). В следующем примере из строки будут извлечены все вхождения «Python».

# findall.py

import re

result = re.findall(r'Python', 'Python is an easy to learn, powerful programming language. Python also has elegant syntax')
print(result)
$ python findall.py 

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

re.split(шаблон, строка, maxsplit = 0, flags = 0)

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

# split.py

import re

result =  re.split(r"y", "Daisy found a puppy")

if result:
    print(result)
else:
   print("No puppy")

Как вы можете видеть выше, образец символа «y» встречается три раза, и выражение разделено во всех случаях, где оно встречается.

$ python split.py 

Связанные методы Re

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

  • Re.findall (шаблон, строка) Метод возвращает список строковых совпадений. Читайте больше в Наше руководство в блоге Отказ
  • Re.Search (шаблон, строка) Метод возвращает объект совпадения первого матча. Читайте больше в Наше руководство в блоге Отказ
  • Re.match (шаблон, строка) Метод Возвращает объект совпадения, если установки Regeex в начале строки. Читайте больше в Наше руководство в блоге Отказ
  • Re.fullmatch (шаблон, строка) Метод возвращает объект совпадения, если Regeex соответствует всей строке. Читайте больше в Наше руководство в блоге Отказ
  • Re.compile (Pattern) Способ подготавливает шаблон регулярной экспрессии – и возвращает объект Regex, который вы можете использовать несколько раз в вашем коде. Читайте больше в Наше руководство в блоге Отказ
  • Re.split (шаблон, строка) Метод возвращает список строк, сопоставив все вхождения шаблона в строке и разделить строку вдоль тех. Читайте больше в Наше руководство в блоге Отказ
  • Re.sub (Re.sub (Pattern, Repl, String ,,) Метод возвращает новую строку, в которой все вхождения шаблона в старой строке заменены на REPL. Читайте больше в Наше руководство в блоге Отказ

Эти семь методов составляют 80% от того, что вам нужно знать, чтобы начать работу с функциональностью регулярных выражений Python.

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

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

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

Шаблон Описание Пример Применяем к тексту
Один любой символ, кроме новой строки . молоко, малако,
Им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)

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

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

Regular Expression Modifiers: Option Flags

Regular expression literals may include an optional modifier to control various aspects of matching. The modifiers are specified as an optional flag. You can provide multiple modifiers using exclusive OR (|), as shown previously and may be represented by one of these −

Sr.No. Modifier & Description
1

re.I

Performs case-insensitive matching.

2

re.L

Interprets words according to the current locale. This interpretation affects the alphabetic group (\w and \W), as well as word boundary behavior (\b and \B).

3

re.M

Makes &dollar; match the end of a line (not just the end of the string) and makes ^ match the start of any line (not just the start of the string).

4

re.S

Makes a period (dot) match any character, including a newline.

5

re.U

Interprets letters according to the Unicode character set. This flag affects the behavior of \w, \W, \b, \B.

6

re.X

Permits «cuter» regular expression syntax. It ignores whitespace (except inside a set [] or when escaped by a backslash) and treats unescaped # as a comment marker.

Область видимости

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

Например, такой код:

Работает с одной глобальной переменной, а такой:

уже порождает локальную.
С моей точки зрения это не очень хорошо, по идее любое использование нелокальных переменных в функции это часть публичного интерфейса функции, её сигнатуры, а значит должно объявляться явно и видимо в начале функции. Также ключевые слова не очень информативны — звучит как определение глобальной функции, а на самом деле означает .

В питоне нет обязательной точки входа с которой начинается выполнение программы как это сделано во многих языках, просто всё что написано на уровне модуля последовательно выполняется, однако так как переменные на уровне модуля это глобальные переменные, то, с моей точки зрения, хорошей практикой должно быть запихивание основного кода в функцию с последующим её вызовом в конце файла:

такое условие сработает если файл будет вызван как скрипт, а не импортирован как модуль.

Major new features of the 3.9 series, compared to 3.8

Some of the new major new features and changes in Python 3.9 are:

  • PEP 573, Module State Access from C Extension Methods
  • PEP 584, Union Operators in
  • PEP 585, Type Hinting Generics In Standard Collections
  • PEP 593, Flexible function and variable annotations
  • PEP 602, Python adopts a stable annual release cadence
  • PEP 614, Relaxing Grammar Restrictions On Decorators
  • PEP 615, Support for the IANA Time Zone Database in the Standard Library
  • PEP 616, String methods to remove prefixes and suffixes
  • PEP 617, New PEG parser for CPython
  • BPO 38379, garbage collection does not block on resurrected objects;
  • BPO 38692, os.pidfd_open added that allows process management without races and signals;
  • BPO 39926, Unicode support updated to version 13.0.0;
  • BPO 1635741, when Python is initialized multiple times in the same process, it does not leak memory anymore;
  • A number of Python builtins (range, tuple, set, frozenset, list, dict) are now sped up using PEP 590 vectorcall;
  • A number of Python modules (_abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time, _weakref) now use multiphase initialization as defined by PEP 489;
  • A number of standard library modules (audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios, zlib) are now using the stable ABI defined by PEP 384.

You can find a more comprehensive list in this release’s «What’s New» document.

[Коллекция] Каковы различные квантификаторы Python Re?

Операторы «и», «или», а «и« не »не являются единственными операторами регулярных выражений, которые вам нужно понять. Так каковы другие операторы?

Далее вы получите быстрый и грязный обзор наиболее важных операций REGEX и как их использовать в Python. Вот самые важные квантификаторы Regex:

Квантификатор
Описание
Пример
.
Wild-Card («DOT») соответствует любому символу в строке, кроме нового символа «N».
Regex ‘…’ соответствует всем словам с тремя символами, такими как «abc», «Cat» и «собака».
*
Звездочка нулевой или больше соответствует произвольному количеству вхождений (включая нулевые вхождения) непосредственно предшествующего Regex.
Regex ‘Cat *’ соответствует строкам «CA», «CAT», «CATT», «CATTT» и «CATTTTTTT».
?
Матчи ноль или один (как следует из названия) либо ноль, либо в одних случаях непосредственно предшествующего Regex.
Regex ‘Cat?’ Соответствует обеим струнам «Ca» и «CAT» – но не «CATT», «CATTT» и «CATTTTTTT».
+
По меньшей мере, один соответствует одному или нескольким вхождению непосредственно предшествующего регеек.
Regex ‘Cat +’ не соответствует строке «CA», а соответствует всем строкам, по меньшей мере, одним задним характером «T», такими как «кошка», «CATT» и «CATTT».
^
Начальная строка соответствует началу строки.
Regex ‘^ p’ соответствует строкам «Python» и «программирование», но не «Lisp» и «шпионить», где символ «p» не происходит в начале строки.
$
Конец строки соответствует концу строки.
Regex ‘Py $’ будет соответствовать строкам «Main.py» и «Pypy», но не строки «Python» и «pypi».
A | B.
Или соответствует либо регезе A или REGEX B

Обратите внимание, что интуиция сильно отличается от стандартной интерпретации или оператора, который также может удовлетворить оба условия.
Regex ‘(Hello) | (Привет) «Соответствует строки« Hello World »и« Привет Python ». Было бы не иметь смысла попытаться сопоставить их обоих одновременно.
Аб
И совпадает с первым регелем А и второе регулярное выражение в этой последовательности.
Мы уже видели его тривиально в Regex ‘Ca’, которое соответствует первым Regex ‘C’ и Second Regex ‘A’.

Обратите внимание, что я дал вышеупомянутые операторы некоторых более значимых имен (жирным шрифтом), чтобы вы могли немедленно понять цель каждого Regex. Например, оператор «^» обычно обозначается как оператор «Caret»

Эти имена не описаны Поэтому я придумал более детские сады, такие как оператор «Пусковая строка».

Мы уже видели много примеров, но давайте погрузимся еще больше!

import re

text = '''
    Ha! let me see her: out, alas! he's cold:
    Her blood is settled, and her joints are stiff;
    Life and these lips have long been separated:
    Death lies on her like an untimely frost
    Upon the sweetest flower of all the field.
'''

print(re.findall('.a!', text))
'''
Finds all occurrences of an arbitrary character that is
followed by the character sequence 'a!'.

'''

print(re.findall('is.*and', text))
'''
Finds all occurrences of the word 'is',
followed by an arbitrary number of characters
and the word 'and'.

'''

print(re.findall('her:?', text))
'''
Finds all occurrences of the word 'her',
followed by zero or one occurrences of the colon ':'.

'''

print(re.findall('her:+', text))
'''
Finds all occurrences of the word 'her',
followed by one or more occurrences of the colon ':'.

'''


print(re.findall('^Ha.*', text))
'''
Finds all occurrences where the string starts with
the character sequence 'Ha', followed by an arbitrary
number of characters except for the new-line character. 
Can you figure out why Python doesn't find any?
[]
'''

print(re.findall('n$', text))
'''
Finds all occurrences where the new-line character 'n'
occurs at the end of the string.

'''

print(re.findall('(Life|Death)', text))
'''
Finds all occurrences of either the word 'Life' or the
word 'Death'.

'''

В этих примерах вы уже видели специальный символ «\ N», который обозначает нового стилевого символа в Python (и большинство других языках). Есть много специальных символов, специально предназначенных для регулярных выражений. Далее мы обнаружим наиболее важные специальные символы.

Match object

You can get methods and attributes of a match object using dir() function.

Some of the commonly used methods and attributes of match objects are:

Example 6: Match object

Here, match variable contains a match object.

Our pattern has two subgroups and . You can get the part of the string of these parenthesized subgroups. Here’s how:

match.start(), match.end() and match.span()

The function returns the index of the start of the matched substring. Similarly, returns the end index of the matched substring.

The function returns a tuple containing start and end index of the matched part.

match.re and match.string

The attribute of a matched object returns a regular expression object. Similarly, attribute returns the passed string.

We have covered all commonly used methods defined in the module. If you want to learn more, visit Python 3 re module.

Using r prefix before RegEx

When r or R prefix is used before a regular expression, it means raw string. For example, is a new line whereas means two characters: a backslash followed by .

Backlash is used to escape various characters including all metacharacters. However, using r prefix makes treat as a normal character.

Regular Expression Patterns

Except for control characters, (+ ? . * ^ $ ( ) { } | \), all characters match themselves. You can escape a control character by preceding it with a backslash.

Following table lists the regular expression syntax that is available in Python −

Sr.No. Pattern & Description
1

^

Matches beginning of line.

2

$

Matches end of line.

3

.

Matches any single character except newline. Using m option allows it to match newline as well.

4

Matches any single character in brackets.

5

Matches any single character not in brackets

6

re*

Matches 0 or more occurrences of preceding expression.

7

re+

Matches 1 or more occurrence of preceding expression.

8

re?

Matches 0 or 1 occurrence of preceding expression.

9

re{ n}

Matches exactly n number of occurrences of preceding expression.

10

re{ n,}

Matches n or more occurrences of preceding expression.

11

re{ n, m}

Matches at least n and at most m occurrences of preceding expression.

12

a| b

Matches either a or b.

13

(re)

Groups regular expressions and remembers matched text.

14

(?imx)

Temporarily toggles on i, m, or x options within a regular expression. If in parentheses, only that area is affected.

15

(?-imx)

Temporarily toggles off i, m, or x options within a regular expression. If in parentheses, only that area is affected.

16

(?: re)

Groups regular expressions without remembering matched text.

17

(?imx: re)

Temporarily toggles on i, m, or x options within parentheses.

18

(?-imx: re)

Temporarily toggles off i, m, or x options within parentheses.

19

(?#…)

Comment.

20

(?= re)

Specifies position using a pattern. Doesn’t have a range.

21

(?! re)

Specifies position using pattern negation. Doesn’t have a range.

22

(?> re)

Matches independent pattern without backtracking.

23

\w

Matches word characters.

24

\W

Matches nonword characters.

25

\s

Matches whitespace. Equivalent to .

26

\S

Matches nonwhitespace.

27

\d

Matches digits. Equivalent to .

28

\D

Matches nondigits.

29

\A

Matches beginning of string.

30

\Z

Matches end of string. If a newline exists, it matches just before newline.

31

\z

Matches end of string.

32

\G

Matches point where last match finished.

33

\b

Matches word boundaries when outside brackets. Matches backspace (0x08) when inside brackets.

34

\B

Matches nonword boundaries.

35

\n, \t, etc.

Matches newlines, carriage returns, tabs, etc.

36

\1…\9

Matches nth grouped subexpression.

37

\10

Matches nth grouped subexpression if it matched already. Otherwise refers to the octal representation of a character code.

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

import re

text = «The ants go marching one by one»

strings =

for string in strings:
match = re.search(string, text)
if match:
print(‘Found «{}» in «{}»‘.format(string, text))
text_pos = match.span()
print(text)
else:
print(‘Did not find «{}»‘.format(string))

1
2
3
4
5
6
7
8
9
10
11
12
13
14

importre

text=»The ants go marching one by one»

strings=’the’,’one’

forstringinstrings

match=re.search(string,text)

ifmatch

print(‘Found «{}» in «{}»‘.format(string,text))

text_pos=match.span()

print(textmatch.start()match.end())

else

print(‘Did not find «{}»‘.format(string))

В этом примере мы импортируем модуль re и создаем простую строку. Когда мы создаем список из двух строк, которые мы будем искать в главной строке. Далее мы делаем цикл над строками, которые хотим найти и запускаем для них поиск. Если есть совпадения, мы выводим их. В противном случае, мы говорим пользователю, что искомая строка не была найдена.

Существует несколько других функций, которые нужно прояснить в данном примере

Обратите внимание на то, что мы вызываем span. Это дает нам начальную и конечную позицию совпавшей строки

Если вы выведите text_pos, которому мы назначили span, вы получите кортеж на подобие следующего: (21, 24). В качестве альтернативы вы можете просто вызвать методы сопоставления, что мы и сделаем далее. Мы используем начало и конец для того, чтобы взять начальную и конечную позицию сопоставления, это должны быть два числа, которые мы получаем из span.

Стандартная библиотека

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

Например, идущий в комплекте модуль для модульного тестирования unittest не имеет никакого отношения к питону и попахивает джавой, поэтому, как : «Eveybody is using py.test …». Хотя вполне интересный, пусть и не всегда подходящий модуль doctest идёт в стандартной поставке.

Идущий в поставке модуль urllib не имеет такого прекрасного интерфейса как стронний модуль requests.

Та же история с модулем для разбора параметров коммандной строки — идущий в комплекте argparse это демонстрация ООП головного мозга, а модуль docopt кажется просто шикарным решением — предельная самодокументируемость! Хотя, по слухам, несмотря на docopt и для click остаётся ниша.

С отладчиком также — как я понял идущий в комплекте pdb мало кто использует, альтернатив много, но похоже основная масса разработчиков используется ipdb, который, с моей точки зрения удобнее всего использовать через модуль-обёртку debug.
Она позволяет вместо просто написать , также она добавляет модуль see для удобной инспекции объектов.

На замену стандартному модулю сериализации pickle делают dill, тут кстати стоит запомнить, что эти модули не подходят для обмена данными в внешними системами т.к. восстанавливать произвольные объекты полученные из неконтролируемого источника небезопасно, для таких случаев есть json (для REST) и gRPC (для RPC).

На замену стандартному модулю обработкти регулярных выражений re делают модуль regex со всякими дополнительными плюшками, вроде классов символов аля .
Кстати, что-то не попалось для питона весёлого отладчика для регексов похожего на перловый.

Вот другой пример — человек сделал свой модуль in-place, чтобы пофиксить кривизну и неполноту API стандартного модуля fileinput в части in place редактирования файлов.

Добавить комментарий

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

Adblock
detector