簡體   English   中英

Python正則表達式-re.search()與re.findall()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM