[英]Python regular expressions - re.search() vs re.findall()
對於學校,我應該編寫一個提取IP地址的Python RE腳本。 我正在使用的正則表達式似乎適用於re.search()
但不適用於re.findall()
。
exp = "(\d{1,3}\.){3}\d{1,3}"
ip = "blah blah 192.168.0.185 blah blah"
match = re.search(exp, ip)
print match.group()
匹配始終是192.168.0.185,但是當我執行re.findall()
時, re.findall()
有所不同
exp = "(\d{1,3}\.){3}\d{1,3}"
ip = "blah blah 192.168.0.185 blah blah"
matches = re.findall(exp, ip)
print matches[0]
0.
我想知道為什么re.findall()
產生0。當re.search()
產生192.168.0.185時,因為兩個函數都使用相同的表達式。
我應該怎么做才能使re.findall()
真正正確地遵循表達式? 還是我犯了某種錯誤?
findall
返回匹配列表,並從文檔中返回:
如果該模式中存在一個或多個組,則返回一個組列表;否則,返回一個列表。 如果模式包含多個組,則這將是一個元組列表。
因此,您的上一個表達式有一個在字符串中最后匹配為0.
的字符串中匹配了3次的組0.
要解決您的問題,請使用: exp = "(?:\\d{1,3}\\.){3}\\d{1,3}"
; 通過使用非分組版本,沒有返回的分組,因此在兩種情況下都返回匹配項。
您只會在該正則表達式中捕獲0,因為它將是最后捕獲的0。
更改表達式以捕獲整個IP,並將重復的部分更改為非捕獲組:
In [2]: ip = "blah blah 192.168.0.185 blah blah"
In [3]: exp = "((?:\d{1,3}\.){3}\d{1,3})"
In [4]: m = re.findall(exp, ip)
In [5]: m
Out[5]: ['192.168.0.185']
In [6]:
如果它有助於解釋正則表達式:
In [6]: re.compile(exp, re.DEBUG)
subpattern 1
max_repeat 3 3
subpattern None
max_repeat 1 3
in
category category_digit
literal 46
max_repeat 1 3
in
category category_digit
這解釋了子模式。 子模式1是findall捕獲的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.