9

テキスト内の空白文字または文字列の末尾に一致させたい。

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')

パターンが正しくありません。
パイソンの使い方は?

4

3 に答える 3

23

\s*$は正しくありません: これは、「1 つ以上のスペースまたは文字列の末尾」ではなく、 「0 個以上のスペースの後に文字列の末尾が続く」に一致します。

この状況では、 (?:\s+|$)(他の人が述べたように、生の文字列の中で)を使用します。その(?:)部分は、その部分式を分離して、 | 演算子は、正しいフラグメントと一致し、正しいフラグメントのみに一致します。

于 2013-05-13T10:40:25.773 に答える
0

これを試して:

assert re.findall('@%s\\s*$' % uname, '@'+uname)

\生の文字列を使用しない場合は、文字をエスケープする必要があります。

\少し紛らわしいですが、python インタープリターとreモジュールの両方のメタ文字であるという事実に由来します。

于 2013-05-13T10:24:00.833 に答える
0

生の文字列を使用します。

assert re.findall(r'@%s\s*$' % uname, '@'+uname)

そうし\ないと、通常の文字列で を特殊文字として使用することは、正規表現で特殊文字として使用することと競合します。

しかし、この主張は失敗することはありません。もちろん、"@" と変数の内容だけで構成される文字列は、 "@"とオプションの (常に空の) 空白、そして文字列の末尾のuname正規表現に一致します。unameそれはトートロジーです。何か他のことを確認しようとしていると思いますか?

于 2013-05-13T10:28:41.230 に答える