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






Метод поиск вернет объект, содержащий результаты вашего шаблона регулярного выражения.
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)
Обновлено: Какого черта вся строка превращается в ссылку в самом комментарии, а не в превью?
Какую часть вы не понимаете? Regex в целом, или как python вытягивает группу zip и вторую (безымянную) группу? Если вы добавите больше деталей к вашему вопросу, вы получите более точные и целенаправленные ответы.