1

このコードが一致オブジェクトを生成しない理由を理解するのに苦労しています。Centos オペレーティング システムで python バージョン 2.6.6 を実行しています。

>>> x = r'\[GOOD\]'
>>> y = r'it made me feel \[GOOD\]'
>>> match = re.search(x, y)
>>> print match
None

私の予想される出力は、次のような一致オブジェクトになります。

>>> match = re.search ('hi', 'hilllaos')
>>> print match
<_sre.SRE_Match object at 0x3299ac0>

説明はありますか?

4

4 に答える 4

4
>>> x = r'\\\[GOOD\\\]'
>>> y = r'it made me feel \[GOOD\]'
>>> re.search(x, y)
<_sre.SRE_Match object at 0x8aa3d40>

\\\[最初\に 2 番目 (中央) のスラッシュをエスケープし、最後のスラッシュで . をエスケープし[ます。

正規表現で使用すると、つまり文字クラス\[だけがエスケープされるため、実際の文字列とは一致しません。[\y

于 2013-11-04T19:42:16.820 に答える
2
x = r'\[GOOD\]'
print(len(x))  # prints 8
print(x[0])  # prints a backslash

文字列にはバックスラッシュが含まれています。

ただし、パターンはバックスラッシュと一致しません。正規表現では、バックスラッシュはそれに続くものを変更します。この例では、バックスラッシュが の特別な機能を無効にしています[

したがって、正規表現はリテラル string と一致するだけ[GOOD]です。しかしx、バックスラッシュのため、あなたにはその文字列が含まれていません。

ターゲット文字列に単純に含める[GOOD]場合は、バックスラッシュを削除します。

y = r'it made me feel [GOOD]'

検索文字列がターゲット文字列のバックスラッシュと一致するようにするには、パターンを変更する必要があります。これはうまくいきます:

x = r'..GOOD..'  # use dot to match anything

しかし、実際に正規表現のバックスラッシュと正確に一致させるには、バックスラッシュを 2 つ使用します。バックスラッシュは、それに続く文字を変更する特殊文字であるため、バックスラッシュを取得するには、それを 2 倍にします。

x = r'\\.GOOD.\\'  match actual backslashes; use dot to match square braces

したがって\\、バックスラッシュと\[左角括弧および右角括弧を一致させるために使用します\]。すべてをまとめる:

x = r'\\\[GOOD\]\\'

ただし、ここでは正規表現の特別な機能を使用していません。これは、1 つのリテラル文字列に一致する単なる正規表現です。

ところで、Python の「生の文字列」の機能はここで便利です。通常の文字列では、バックスラッシュを 1 つにするにはバックスラッシュを 2 つにする必要があります。したがって、通常の文字列を使用してパターンを記述するには、バックスラッシュを 2 倍にする必要があります。

x = '\\\\\\[GOOD\\]\\\\'  # note not a raw string

うん!

于 2013-11-04T19:59:19.377 に答える
2

スラッシュを探していませんでした:

>>> re.search(r'\[GOOD\]', 'it made me feel [GOOD]')
<_sre.SRE_Match object at 0x00000000026C5C60>
于 2013-11-04T19:41:42.140 に答える
1

正規表現コンパイラはバックスラッシュも解釈するため、パターン ( x)は実質的に になり{GOOD]ます。それは文字列に表示されないため、一致しません。バックスラッシュの後{GOODバックスラッシュが続き]、その後に.

x = r'\\\[GOOD\\\]'

これでパターンが一致しyます。

于 2013-11-04T19:45:35.170 に答える