2009-01-11 106 views
6

我最近有一本关于python的书,它有一章关于正则表达式,有一段我不能理解的代码。有人可以解释这里发生了什么(这部分是在正则表达式组)吗?Python-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' 
+0

哪部分你不明白?一般的正则表达式,还是python如何拉出'zip'组和第二(未命名)组?给你的问题添加更多细节将会让你更好,更有针对性的答案。 – 2009-01-11 18:46:05

+0

所以它只是意味着它创建了一个称为zip的组,它执行其余行的状态,如 “Zip:\ s * \ d \ d \ d \ d \ d)\ s *(State:\然后它的其余部分创建一个字典,称为groupdict与邮政和国家 我想我得到它:) – user33061 2009-01-11 18:53:01

回答

8

正则表达式定义:

(?P<zip>...) 

创建一个名为组 “拉链”

Zip:\s* 

匹配 “邮编:” 零个或多个空白字符

\d 

匹配一个数字

\w 

匹配单词字符[A-ZA-Z0-9_]

y.groupdict('zip') 

的groupdict方法返回与命名的基团键和它们作为值匹配的字典。在这种情况下,本场比赛对于“压缩”组获取返回

y.group(2) 

返回比赛为第二组,这是一个无名小组“(...)”

希望有所帮助。

2

搜索方法会返回一个包含您的正则表达式的结果的对象。

groupdict返回组的名字,其中的键是由(?P ...)定义的组的名称。这里名称是该组的名称。

返回匹配的组的列表。 “州:纽约州”是你的第三组。第一个是整个字符串,第二个是“Zip:10010”。

这是一个相对简单的问题。我只是查找谷歌的方法文件,发现this page。 Google是你的朋友。

0

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

由于第一组圆括号命名为zip,因此您可以使用匹配的groupdict方法访问其匹配项以获得{identifier: match}对。或者,如果您只对比赛感兴趣,那么您可以使用y.group('zip')(因为您已经知道该标识符,所以通常是有意义的)。您也可以使用序号(1)访问相同的匹配项。下一场比赛是未命名的,因此访问它的唯一方法是其编号。

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

添加到以前的答案:在我看来,你最好选择一种类型的组(名字或未命名),并坚持下去。通常我使用命名组。例如:

>>> 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'} 
相关问题