2017-09-27 23 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

はい、あなたは正しいです!私は負のlookbehindのスペースを忘れてしまった。私は今私の答えを変える! – ritchie46

関連する問題