2016-10-13 21 views
4

私は、テキスト中の電話番号のパターンに合わせるプログラムを作成中です。正規表現を見つける ' n'

私はこのテキストの読み込みだ:変数に

(01111-222222)fdf 
01111222222 
(01111)222222 
01111 222222 
01111.222222 

を、そしてそれは、これを返しています "のfindAll" を使用して:

('(01111-222222)', '(01111', '-', '222222)') 
('\n011112', '', '\n', '011112') 
('(01111)222222', '(01111)', '', '222222') 
('01111 222222', '01111', ' ', '222222') 
('01111.222222', '01111', '.', '222222') 

これは私の式である:

ex = re.compile(r"""(
    (\(?0\d{4}\)?)?  # Area code 
    (\s*\-*\.*)?   # seperator 
    (\(?\d{6}\)?)  # Local number 
    )""", re.VERBOSE) 

私はなぜ '\ n'が捕らえられているのか分かりません。

'+'の代わりに '\\.*'の*が指定されている場合、その式は必要なものとして機能します。または、単に*を削除しても(そして、1つのピリオドで区切られた2つの数字のセットが見つけられれば)、式が機能します。

+0

'\ s *' '\ n 'を含む –

+0

' re.DOTALL'(または 're.S')フラグがセットされていない限り、' .'は改行にマッチしません。 – cdarke

+0

私は最後の段落が事実ではなく、真実であることを認識しました。私は結果を正しく見なかった。 –

答えて

4

空白記号veritcal \sマッチ水平両方。 re.VERBOSEがある場合、通常のスペースとエスケープスペース\を一致させることができます。または、\r\n\sから[^\S\r\n]に置き換えて、水平空白と一致させることができます。

使用

ex = re.compile(r"""(
    (\(?0\d{4}\)?)?  # Area code 
    ([^\S\r\n]*-*\.*)? # seperator ((HERE)) 
    (\(?\d{6}\)?)  # Local number 
    )""", re.VERBOSE) 

またregex demo

、エスケープを必要としない文字クラスの外-参照してください。

+0

FYI、[オンラインPythonデモ](https://ideone.com/T9AO3b)を参照してください。 –

関連する問題