簡體   English   中英

Python正則表達式負面看后面沒有失敗的匹配

[英]Python regex negative lookbehind not failing match

我正在寫一個正則表達式來匹配電話號碼。 我遇到的一個問題是一些郵政編碼看起來像電話號碼。 例如,在巴西,郵政編碼如下所示:

30.160-0131

所以一個簡單的正則表達式會將它們捕獲為誤報:

In [63]: re.search(r"(?P<phone>\d+\.\d+-\d+)", "30.160-0131")
Out[63]: <_sre.SRE_Match at 0x102150990>

幸運的是,這樣的郵政編碼通常帶有一個前綴,通常意味着“郵政編碼”,如下所示:

CEP 30.160-0131

所以,如果你看到CEP看起來像一個電話號碼,那么它不是一個電話號碼 - 它是一個郵政編碼。 我一直試圖寫一個正則表達式來捕捉使用負面的后觀 ,但它不起作用。 它仍然匹配:

In [62]: re.search(r"(?<!CEP )(\d+\.\d+-\d+)", "CEP 30.160-0131")
Out[62]: <_sre.SRE_Match at 0x102150eb8>

為什么它仍然匹配,如何讓負面的后衛失敗?

表達式匹配,因為您沒有執行任何操作來錨定數字。 例如:

"CEP 11.213-132"

將匹配1.213-132因為它不會立即跟隨CEP 但是你可以強制在第一個數字之前的空格或行錨的開頭:

re.search(r"(?<!CEP)(?:\s+|^)(\d+\.\d+-\d+)", s)

如果您允許匹配這些郵政編碼,並且仍然只提取電話號碼,則可以避免否定前瞻:

m = re.search(r"CEP \d+\.\d+-\d+|(\d+\.\d+-\d+)", s)

然后檢查m.group(1)是否有電話號碼。


re.findall小演示:

>>> import re
>>> s = "There is a CEP 30.160-0131 and a  30.160-0132 in that sentence, which repeats itself like there is a CEP 30.160-0131 and a  30.160-0132 in that sentence."
>>> m = re.findall(r"CEP \d+\.\d+-\d+|(\d+\.\d+-\d+)", s)
>>> print(m)
['', '30.160-0132', '', '30.160-0132']

從那里,你可以過濾掉空字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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