3

次のような文字列があるとします

x = "spam ?and eggs"

そして、私はそれに合わせようとしてい"?and"ます。現在、私は次のようにしています:

>>> print re.findall(re.escape('?and'), x)
['?and']

これは正しい使用例re.escapeですか? 他のタイプの正規表現構文が含まれている可能性のある、私が探している他の文字列リテラルで動作しますか?

pexpect.spawn.expect(pattern)私の使用例は、入力パターンが正規表現にコンパイルされる文字列型である可能性があるin の引数を使用する場合です。場合によっては、探しているものが正規表現のように見えるかもしれませんが、実際には一致させたい文字列リテラルです。

4

3 に答える 3

6

はい、それはまさに正しいユースケースですre.escapeドキュメントには、「正規表現のメタ文字を含む可能性のある任意のリテラル文字列に一致させたい場合に役立つ」と書かれていますが、最初の例では、エスケープする方が少し簡単だと思います次のいずれかを使用して、疑問符を自分で入力します。

re.findall(r'\?and', x)          # \? in a raw string literal
re.findall('\\?and', x)          # \? in a non-raw string literal, so, \\?
re.findall('[?]and', x)          # "cheat" by using a character class
于 2012-03-15T02:22:34.410 に答える
2

pexpect の場合、expect() の代わりに expect_exact() を使用して正規表現機能を無効にすることができ、指定した python 文字列と正確に一致します。

ドキュメントから:

expect_exact (self, pattern_list, timeout=-1, searchwindowsize=-1)
これは expect() に似ていますが、'pattern_list' でコンパイルされた正規表現の代わりに単純な文字列マッチングを使用します。「pattern_list」は文字列の場合があります。文字列のリストまたはその他のシーケンス。または TIMEOUT および EOF。

この呼び出しは、次の 2 つの理由により、expect() よりも高速である可能性があります。文字列検索は、RE マッチングよりも高速であり、検索を入力バッファーの末尾のみに制限することが可能です。

この方法は、一致させたい正規表現文字のエスケープについて心配したくない場合にも役立ちます。

于 2012-06-07T01:23:29.480 に答える
0

うん、それは私には正しく見えます。パターン全体をエスケープしている場合は、通常、find正規表現なしで使用する必要があることを示しています。

x.find('?and')

-1 または位置を指定します。そう...

>>> if x.find('?and') != -1: 
...   print "Match!"
... 
Match!
于 2012-03-15T02:25:58.833 に答える