テキスト内の空白文字または文字列の末尾に一致させたい。
import re
uname='abc'
assert re.findall('@%s\s*$' % uname, '@'+uname)
assert re.findall('@%s\s*$' % uname, '@'+uname+' '+'aa')
assert not re.findall('@%s\s*$' % uname, '@'+uname+'aa')
パターンが正しくありません。
パイソンの使い方は?
\s*$
は正しくありません: これは、「1 つ以上のスペースまたは文字列の末尾」ではなく、 「0 個以上のスペースの後に文字列の末尾が続く」に一致します。
この状況では、
(?:\s+|$)
(他の人が述べたように、生の文字列の中で)を使用します。その(?:)
部分は、その部分式を分離して、 | 演算子は、正しいフラグメントと一致し、正しいフラグメントのみに一致します。
これを試して:
assert re.findall('@%s\\s*$' % uname, '@'+uname)
\
生の文字列を使用しない場合は、文字をエスケープする必要があります。
\
少し紛らわしいですが、python インタープリターとre
モジュールの両方のメタ文字であるという事実に由来します。
生の文字列を使用します。
assert re.findall(r'@%s\s*$' % uname, '@'+uname)
そうし\
ないと、通常の文字列で を特殊文字として使用することは、正規表現で特殊文字として使用することと競合します。
しかし、この主張は失敗することはありません。もちろん、"@" と変数の内容だけで構成される文字列は、 "@"とオプションの (常に空の) 空白、そして文字列の末尾のuname
正規表現に一致します。uname
それはトートロジーです。何か他のことを確認しようとしていると思いますか?