2017-09-27 33 views
2

您好,python我想抓住文本中的電話號碼,但是想要排除接下來的單詞傳真或傳真。帶有負向視圖的Python正則表達式

我用下面的正則表達式,如果句子傳真或傳真開始,但如果傳真是句子裏面不起作用其中工程:

^(?!fax|Fax)(?:.*?)(?![-a-z])((?:[^0-9])((\+|00)33\s?|0|\(0\))[123456789][ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2})(?![0-9]) 

在這裏我分析文本的例子:

text 
Adresse quai du Sa fax 06 32 32 32 33 rtel – 59100 ROUBAIX| FRANCE 
faTel : 0 8 99 70 1761 – Fax : 06 32 32 32 34 
Mail :[email protected] 
06 32 32 32 35 

Fax 06 32 32 32 36 
tel 06 32 32 32 37 henrg 

我正則表達式的結果是:

Match 1 
Full match 5-42 `Adresse quai du Sa fax 06 32 32 32 33` 
Group 1. 27-42 ` 06 32 32 32 33` 
Group 2. 28-29 `0` 
Match 2 
Full match 72-117 `faTel : 0 8 99 70 1761 – Fax : 06 32 32 32 34` 
Group 1. 102-117 ` 06 32 32 32 34` 
Group 2. 103-104 `0` 
Match 3 
Full match 118-157 `Mail :[email protected] 
06 32 32 32 35` 
Group 1. 142-157 ` 
06 32 32 32 35` 
Group 2. 143-144 `0` 
Match 4 
Full match 178-196 `tel 06 32 32 32 37` 
Group 1. 181-196 ` 06 32 32 32 37` 
Group 2. 182-183 `0` 

但我不希望 「06 32 32 32 34」 和「0 6 32 32 32 33" 的結果,因爲‘傳真’是前...

感謝

+0

我是否正確理解您希望獲得除數字之外的所有數字,然後是傳真和傳真? – user54

+0

是的你是對的 –

回答

2

我建議使用一個正則表達式將匹配你不需要的東西,但將匹配和捕獲你需要:

(?i)fax\W*\d[\s\d]*|(\d[\s\d]*\d) 

請參閱regex demo。綠色突出項目是你需要抓住的東西。注意:您將在組1中獲得的號碼應至少包含2位數字。此外,您可以按照進一步的要求精確模式,只是使用相同的「框架」,因爲我試圖簡化正則表達式結構以顯示主要概念。

詳細

  • (?i) - 不區分大小寫修改
  • fax - 在fax
  • \W* - 任何0+非字字符(你可以精確它只用空格和冒號工作,如\s*(?::\s*)?
  • \d - 一個數字
  • [\s\d]* - 0+空格或數字
  • | - 或...
  • (\d[\s\d]*\d) - 第1組(您需要的值)
    • \d - 一個數字
    • [\s\d]* - 0+空格或數字
    • \d - 一個數字

在Python 2,使用

import re 
rx = r"(?i)fax\W*\d[\s\d]*|(\d[ \d]*\d)" 
s ="text\nAdresse quai du Sa fax 06 32 32 32 33 rtel – 59100 ROUBAIX| FRANCE\nfaTel : 0 8 99 70 1761 – Fax : 06 32 32 32 34\nMail :[email protected]\n06 32 32 32 35\n\nFax 06 32 32 32 36\ntel 06 32 32 32 37 henrg" 
res = filter(None, re.findall(rx, s)) 
print(res) 
# => ['59100', '0 8 99 70 1761', '06 32 32 32 35', '06 32 32 32 37'] 

查看Python 2 demo

+0

您是否知道如何匹配「Par fax au 02 97 01 22 98」?非常感謝 –

+0

@ henri_1310 [它匹配](https://regex101.com/r/1iBSes/2)。 –

0

您使用的超前,而不是回顧後(?<!..)

有了這個正則表達式我似乎得到所有的手機數字和沒有傳真號碼:

(?<!Fax |fax)((\d\d\s){5}|((\d\s){2}(\d\d\s){2}\d{4})) 
+0

是的,你是對的!我在負面的背後隱藏了空間。我現在會改變我的答案! – ritchie46