2012-03-19 12 views
16

[email protected]のようなものにマッチした後、私は(\.\w+)(これは単なる例です)の1つ以上をキャプチャしたい私は(。\ w +)+を追加しようとしましたが、最後のマッチだけをキャプチャします。例えば、[email protected]試合だけは[email protected]部分の後.trを含めるので、私は.something.eduグループを失いました。これをPythonの正規表現で行うことはできますか、最初はすべてをマッチングし、後でサブパターンを分割することをお勧めしますか?Pythonの正規表現でサブパターンを繰り返しキャプチャする

答えて

4

あなただけの代わりにこれを行うことによって、最後のマッチをキャプチャ(\.\w+)+の問題を解決することができます((?:\.\w+)+)

+0

(あなたは小文字に変換した場合): 're.sub(UR '((:?。[AZ] \){2、 }) '、ラムダ:m.group(1).replace('。 '、' ')、テキスト) ' – bahmait

+0

ありがとう。私は括弧を付け加えて繰り返しサブパターンにマッチさせることができましたが、そのパターンの最後のものと一致するグループがありました。私は '(?:...)'が非捕捉グループを作るのを見ていませんでした。 https://docs.python.org/2/library/re.html#regular-expression-syntaxこれを追加すると、その問題が修正されます。 –

11

これは動作します:

>>> regexp = r"[\w\.][email protected](\w+)(\.\w+)?(\.\w+)?(\.\w+)?(\.\w+)?(\.\w+)?" 
>>> email_address = "[email protected]" 
>>> m = re.match(regexp, email_address) 
>>> m.groups() 
('galactica', '.caprica', '.fleet', '.mil', None, None) 

しかし、それは6つのサブグループの最大値に制限されます。これを行うには良い方法は次のようになります。正規表現は、電子メールアドレス限り、罰金です

>>> m = re.match(r"[\w\.][email protected](.+)", email_address) 
>>> m.groups() 
('galactica.caprica.fleet.mil',) 
>>> m.group(1).split('.') 
['galactica', 'caprica', 'fleet', 'mil'] 

注意は単純です - しかし、これがために破損するあらゆる種類のものがあります。電子メールアドレス正規表現の詳細については、this questionを参照してください。私は後に繰り返しサブパターンを分割するといいと思うあなたのケースでは

>>> m = regex.match(r'([.\w]+)@((\w+)(\.\w+)+)', '[email protected]') 
>>> m.groups() 
('yasar', 'webmail.something.edu.tr', 'webmail', '.tr') 
>>> m.captures(4) 
['.something', '.edu', '.tr'] 

19

reモジュールを繰り返しキャプチャを(regexがそれをサポートしています)をサポートしていません。シンプルで読みやすいコード(例:@Li-aung Yip's answerのコードを参照)につながります。

+0

好奇心から、繰り返しキャプチャを一致させると、どのように置換パターンを書いていますか? '\ 1'、' \ 2'、 '\ 3'などの意味は'(\。\ w +) 'にマッチした回数によって変わりますか? –

+0

@ Li-aung Yip: '\ 1'は' m.group(1) 'に対応します。意味は変わらない。関数を置換パターンとして使用し、その中に 'm.captures()'を呼び出すことができます。 – jfs

+0

あなたの例では、 '\ 1'、' \ 2'、 '\ 3'の意味は一度しか捕捉されないので明らかです。しかし '\(\。\ w +)+'に対応する '\ 4'の意味は何ですか? '\ 4'は" 4番目のキャプチャグループと一致する最後の部分文字列 "、この場合は' .tr 'のように見えます。 –

1

これは、あなたが探しているものです。略語については

>>> import re 

>>> s="[email protected]" 
>>> r=re.compile("\.\w+") 
>>> m=r.findall(s) 

>>> m 
['.something', '.edu', '.tr'] 
関連する問題