亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

不以國家/地區代碼開頭(如前綴)的 9 位數字的正則表達式

不以國家/地區代碼開頭(如前綴)的 9 位數字的正則表達式

慕姐8265434 2023-09-12 17:41:05
我正在嘗試過濾掉特定文本中潛在的公民服務號碼(荷蘭語 BSN),這些文本也充滿了荷蘭電話號碼。電話號碼以 +31 國家/地區代碼開頭,而 BSN 號碼則不然。有人可以幫我想出正則表達式來匹配任何不以 開頭的 9 位數字嗎+<country-code-like-prefix><space>?例如,在句子中:號碼是+31 713176319,另一個號碼是650068168。我想提取650068168,但不提取713176319。這可能可以通過負向預測來解決,但我無法找到正確的解決方案。
查看完整描述

2 回答

?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

使用負回顧:

(?<!\+\d\d )\b\d{9}\b

這可確保 9 位數字前面沒有(“+”后跟兩位數字,后跟空格字符)。

演示。

請注意,這僅在國家/地區代碼為兩位數(如您的示例中所示)時才有效。要支持一位或三位數字的國家/地區代碼,事情會變得有點棘手,因為 python 不支持非固定寬度的 Lookbehinds。但是,您可以像這樣使用多個 Lookbehind:

(?<!\+\d )(?<!\+\d{2} )(?<!\+\d{3} )\b\d{9}\b

演示。


查看完整回答
反對 回復 2023-09-12
?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

我建議re.findall在這里使用:


inp = "The number is +31 713176319 and 650068168 is another one."

matches = re.findall(r'(?:^|(?<!\S)(?!\+\d+)\S+ )(\d{9})\b', inp)

print(matches)

這打?。?/p>


['650068168']

這里的正則表達式策略是匹配 9 位獨立數字,當它出現在字符串的最開頭時,或者它前面有一些不是國家/地區代碼前綴的“單詞”(此處松散定義的單詞)\S+。


這是所使用的正則表達式的解釋:


(?:

    ^          from the start of the string

    |          OR

    (?<!\S)    assert that what precedes is whitespace or start of the string

    (?!\+\d+)  assert that what follows is NOT a country code prefix

    \S+        match the non prefix "word", followed by a space

)

(\d{9})        match and capture the 9 digit number

\b             word boundary


查看完整回答
反對 回復 2023-09-12
  • 2 回答
  • 0 關注
  • 255 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號