2

私は次のような文字列を持っています

line = "... ... constant0 username@domain\r"

ドメインを抽出する必要があります

matchObj = re.match( 'constant\d+\s+(\w+)\@(\w+)', line, re.M|re.I)

matchObj 常に戻ってきNoneます。私がここで見逃しているのは何ですか?

4

3 に答える 3

6

ドキュメントから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
于 2013-08-15T09:39:59.567 に答える
1

文字列の先頭で一致させるには、re.searchnotを使用します。re.matchre.match

search() 対 match() :

Python は、正規表現に基づいた 2 つの異なるプリミティブ操作を提供します。文字列の先頭re.match()でのみ一致をチェックし、文字列内の任意の場所で一致をチェックします (これは Perl がデフォルトで行うことです)。re.search()

于 2013-08-15T09:39:18.530 に答える
1

re.match文字列の先頭にのみ一致します。re.searchどこでもマッチします。docsに従って.*、 re.match の先頭にa を追加するだけでなく、使用re.searchして最適化を取得してください! (re.search最初の文字に一致する文字列の部分のみをチェックするために、c でクイック ループを作成します。あいまいな文字で始まる場合は、文字列の最後まで移動してバックトラックする必要があります。)

ここでは、Python の正規表現機能のほとんどについて、より穏やかで (私が思うに) 一般的にはより適切な紹介を示します。

于 2013-08-15T09:41:16.187 に答える