Python-Regex, что здесь происходит? - PullRequest
6 голосов
/ 11 января 2009

У меня недавно была книга по питону, есть глава о 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 ]

8 голосов
/ 11 января 2009

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

(?P<zip>...)

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

Zip:\s*

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

\d

Совпадение с цифрой

\w

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

y.groupdict('zip')

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

y.group(2)

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

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

2 голосов
/ 11 января 2009

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

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

group возвращает список групп, которые соответствуют. «State: NY» - ваша третья группа. Первая - это вся строка, а вторая - «Zip: 10010».

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

1 голос
/ 11 января 2009
# 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)
0 голосов
/ 12 января 2009

друг - ваш друг:

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

РЕДАКТИРОВАТЬ: Почему, черт возьми, он делает всю строку ссылкой в ​​фактическом комментарии, но не предварительный просмотр?

0 голосов
/ 11 января 2009

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

>>> 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'}
0 голосов
/ 11 января 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...