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