2010-11-21 7 views
1

私はパターンpat='dd|dddd'を使用していましたが、私はそれがddかddddと一致すると考えました。正規表現

import re 
re.search(pat,'ddd') 
re.search(pat,'ddddd') 

そのような理由で任意の数のd(s)が一致するのはなぜですか?

+1

既に与えられた回答に加えて、文字列の先頭を超えて一致を見つけるのを避けるために、 're.search'の代わりに' re.match'を使うことを検討してください。 (あなたはまだあなたの望む行動を得るために最後を固定する必要があるので、それらの他の答えに注意を払う必要があります) –

答えて

10

何とか正規表現をアンカーする必要があります。正規表現は文字列内を検索してパターンを検索します。したがって、 "dd"はオフセット0,1,2,3,4,5,6の "dddddddd"にあります。

文字列全体を一致させる場合は、^dd$を試してください。 ^は文字列の先頭に一致し、$は最後に一致します。したがって、^(dd|dddd)$はあなたが望む動作をします。

文字列内でddまたはddddにのみ一致させたい場合。 [^d](dd|dddd)[^d]これは "d以外のもの"と一致し、次に "d以外のもの"のいずれか2つまたは4つのdsに一致します

2

既に述べたように、searchは実際にあなたが使用すべき機能です。 matchまたはfindallを使用してみてください。

>>> import re 
>>> re.match('dd|dddd','dd').group() 
'dd' 
>>> re.findall('dd|dddd','dd') 
['dd'] 
>>> re.match('dd|dddd','ddddd').group() 
'dd' 
>>> re.match('dddd|dd','ddddd').group() 
'dddd'