Python正则表达式,这里发生了什么?

6
我最近得到了一本关于Python的书,其中有一章是关于正则表达式的,但是有一段代码我真的不太懂。能否有人解释一下这里到底发生了什么(这一部分是关于正则表达式组的)?
>>> 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'

你不理解哪部分呢?正则表达式一般的用法,还是Python如何提取“zip”组和第二个(未命名)组?提供更多细节可以获得更好、更具针对性的答案。 - Ian Varley
那么这是否意味着它创建了一个名为zip的组,该组执行其余行所述的操作,例如"Zip:\s\d\d\d\d\d)\s(State:\s*\w\w)"然后其余部分创建了一个名为groupdict的字典,其中包含Zip和State?我想我明白了 :) - user33061
6个回答

8

正则表达式定义:

(?P<zip>...)

创建一个名为“zip”的组。

Zip:\s*

匹配"Zip:"和零个或多个空格字符

\d

匹配数字

\w

匹配单词字符[A-Za-z0-9_]

y.groupdict('zip')

groupdict方法返回一个字典,其中以命名组为键,匹配项为值。在这种情况下,“zip”组的匹配项将被返回。
y.group(2)

返回第二个未命名组"(…)"的匹配结果。

希望能帮到你。


2
“search”方法将返回一个包含正则表达式模式结果的对象。
“groupdict”返回一个字典,其中键是由(?P...)定义的组的名称。这里,“name”是组的名称。
“group”返回匹配的组列表。“State: NY”是第三个组。第一个组是整个字符串,第二个组是“Zip: 10010”。
顺便说一下,这是一个相对简单的问题。我只是在谷歌上查找了该方法文档,并找到了this page。谷歌是你的朋友。

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)

0

(?P<identifier>match) 语法是 Python 实现命名捕获组的方式。这样,您可以使用名称而不仅仅是顺序号来访问由 match 匹配的内容。

由于第一组括号被命名为 zip,因此您可以使用匹配的 groupdict 方法来获取一个 {identifier: match} 对。或者,如果您只对匹配项感兴趣(通常是因为您已经知道标识符),则可以使用 y.group('zip')。您还可以使用其顺序号(1)访问相同的匹配项。下一个匹配项没有名称,因此唯一访问它的方法是使用其数字。


0

补充之前的答案:我认为你最好选择一种类型的组(命名或未命名)并坚持使用它。通常我使用命名组。例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接