私は次のような文字列を持っています
line = "... ... constant0 username@domain\r"
ドメインを抽出する必要があります
matchObj = re.match( 'constant\d+\s+(\w+)\@(\w+)', line, re.M|re.I)
matchObj
常に戻ってきNone
ます。私がここで見逃しているのは何ですか?
ドキュメントからre.match
:
MULTILINEモードであっても、re.match() は文字列の先頭のみに一致し、各行の先頭には一致しないことに注意してください。
文字列内の任意の場所で一致を見つけたい場合は、代わりにsearch()を使用します ( search() と match()も参照してください)。
re.match()
は文字列内のどこにも一致を見つけませんが、そうしますre.search()
。re.search()
代わりに (ほとんどの場合)を使用することをお勧めします。
観察:
>>> import re
>>> line = "... ... constant0 username@domain\r"
>>> matchObj = re.match( 'constant\d+\s+(\w+)\@(\w+)', line, re.M|re.I)
>>> matchObj # None
>>> matchObj = re.search('constant\d+\s+(\w+)\@(\w+)', line, re.M|re.I)
>>> matchObj
<_sre.SRE_Match object at 0x10ce84470>
>>> print matchObj.group(0)
constant0 username@domain
>>> print matchObj.group(1)
username
文字列の先頭で一致させるには、re.search
notを使用します。re.match
re.match
Python は、正規表現に基づいた 2 つの異なるプリミティブ操作を提供します。文字列の先頭
re.match()
でのみ一致をチェックし、文字列内の任意の場所で一致をチェックします (これは Perl がデフォルトで行うことです)。re.search()
re.match
文字列の先頭にのみ一致します。re.search
どこでもマッチします。docsに従って.*
、 re.match の先頭にa を追加するだけでなく、使用re.search
して最適化を取得してください! (re.search
最初の文字に一致する文字列の部分のみをチェックするために、c でクイック ループを作成します。あいまいな文字で始まる場合は、文字列の最後まで移動してバックトラックする必要があります。)
ここでは、Python の正規表現機能のほとんどについて、より穏やかで (私が思うに) 一般的にはより適切な紹介を示します。