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

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

Какую часть вы не понимаете? Regex в целом, или как python вытягивает группу zip и вторую (безымянную) группу? Если вы добавите больше деталей к вашему вопросу, вы получите более точные и целенаправленные ответы.

Ian Varley 11.01.2009 21:46

значит ли это, что он создает группу под названием zip, которая выполняет то же, что и в остальной части строки, как в "Zip: \ s * \ d \ d \ d \ d \ d) \ s * (State: \ s * \ w \ w) ", а затем остальная часть создает dict под названием groupdict с Zip и состоянием, я думаю, я понял :)

user33061 11.01.2009 21:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
2
1 400
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

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

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

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

Ответ принят как подходящий

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

(?P<zip>...)

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

Zip:\s*

Соответствие "Zip:" и ноль или более пробелов

\d

Подобрать цифру

\w

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

y.groupdict('zip')

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

y.group(2)

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

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

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

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

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

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

>>> 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'}

strfriend - друг ваш:

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

Обновлено: Какого черта вся строка превращается в ссылку в самом комментарии, а не в превью?

Другие вопросы по теме