2009-01-11 96 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'} 
相關問題