Python-Regex, что здесь происходит?

Недавно у меня есть книга на python, и у нее есть глава о Regex, есть раздел кода, который я не могу понять. Может кто-нибудь объяснить, что здесь происходит (этот раздел посвящен группам Regex)?

>>> my_regex = r'(?P<zip>Zip:\s*\d\d\d\d\d)\s*(State:\s*\w\w)' >>> addrs = "Zip: 10010 State: NY" >>> y = re.search(my_regex, addrs) >>> y.groupdict('zip') {'zip': 'Zip: 10010'} >>> y.group(2) 'State: NY' 

6 Solutions collect form web for “Python-Regex, что здесь происходит?”

определение regex:

 (?P<zip>...) 

Создает именованную группу "zip"

 Zip:\s* 

Совпадение «Zip:» и ноль или более пробельных символов

 \d 

Сопоставьте цифру

 \w 

Соответствовать символу слова [A-Za-z0-9_]

 y.groupdict('zip') 

Метод groupdict возвращает словарь с именованными группами как ключи и их совпадениями как значения. В этом случае возвращается ответ для группы «zip»

 y.group(2) 

Верните совпадение для второй группы, которая является неназванной группой "(…)"

Надеюсь, это поможет.

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

groupdict возвращает dictionnary групп, где ключи – это названия групп, определенных (? P …). Здесь имя – это имя для группы.

group возвращает список групп, которые соответствуют. «Штат: Нью-Йорк» – ваша третья группа. Первая – это целая строка, а вторая – «Почтовый индекс: 10010».

Кстати, это был относительно простой вопрос. Я просто просмотрел документацию по методу google и нашел эту страницу . Google – ваш друг.

 # my_regex = r' <= this means that the string is a raw string, normally you'd need to use double backslashes # ( ... ) this groups something # ? this means that the previous bit was optional, why it's just after a group bracket I know not # * this means "as many of as you can find" # \s is whitespace # \d is a digit, also works with [0-9] # \w is an alphanumeric character my_regex = r'(?P<zip>Zip:\s*\d\d\d\d\d)\s*(State:\s*\w\w)' addrs = "Zip: 10010 State: NY" # Runs the grep on the string y = re.search(my_regex, addrs) 

Синтаксис (?P<identifier>match) – это способ Python для реализации названных групп захвата. Таким образом, вы можете получить доступ к тому, что соответствовало match используя имя, а не просто последовательный номер.

Поскольку первый набор скобок называется zip , вы можете получить доступ к его совпадению, используя метод groupdict чтобы получить пару {identifier: match} . Или вы можете использовать y.group('zip') если вас интересует только совпадение (что обычно имеет смысл, поскольку вы уже знаете идентификатор). Вы также можете получить доступ к одному и тому же совпадению, используя его порядковый номер (1). Следующий матч не указан, поэтому единственный доступ к нему – его номер.

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

 >>> my_regex = r'(?P<zip>Zip:\s*\d\d\d\d\d)\s*(?P<state>State:\s*\w\w)' >>> addrs = "Zip: 10010 State: NY" >>> y = re.search(my_regex, addrs) >>> print y.groupdict() {'state': 'State: NY', 'zip': 'Zip: 10010'} 

подруга – ваш друг:

http://strfriend.com/vis?re=(Zip%3A\s*\d\d\d\d\d)\s*(State%3A\s*\w\w)

EDIT: Почему, черт возьми, он делает всю строку ссылкой в ​​фактическом комментарии, но не предварительный просмотр?

  • Почему re.findall () находит больше совпадений, чем re.sub ()?
  • Python Поиск всех открытых скобок в строке
  • Замена с использованием нескольких регулярных выражений или большего размера в Python
  • Regex соответствует количеству букв
  • Несколько групп Python RegEx
  • Разбиение строки Python на регулярное выражение
  • Как удалить все слова, которые заканчиваются на «:» из строки в Python?
  • Regex python не будет работать, поскольку я хочу
  • Python - лучший язык программирования в мире.