2012-03-15 9 views
3

は私がregexy構文を持つ文字列とのマッチング方法は?

x = "spam ?and eggs" 

のような文字列があると私は"?and"ことと一致するようにしようとしていると仮定します。現在、私はこのようにそれをやっている:

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

これはre.escapeの正しい使用事例ですか?それは他のタイプの正規表現構文を持っている可能性のある他の文字列リテラルでも使えますか?

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

答えて

2

、あなたは(expect_exactを使用することができます)の代わりに、期待する()正規表現の機能を無効にし、そしてそれは正確にあなたがそれを与えるPythonの文字列にマッチします。ドキュメントから

expect_exact(自己、pattern_list、タイムアウト= -1、searchwindowsize = -1)
これは)(期待する類似しているが、マッチングの代わり 普通文字列を使用'pattern_list'に正規表現をコンパイルしました。 'pattern_list'は とすることができます。文字列のリストまたは他のシーケンス。またはTIMEOUTとEOF。

文字列 の検索がREの一致よりも速く、 の検索を入力バッファの末尾に限定することができます。

このメソッドは、 でもあります。一致させる通常の 式の文字をエスケープすることを心配したくない場合に便利です。

6

はい、それはre.escapethe documentationのために正確に正しいユースケースは、あなたの最初の例では、私はそれがだと思うけれども—「あなたはそれで正規表現のメタ文字を有していてもよく、任意の文字列リテラルを一致させたい場合に便利」それはだと言いますこれらのいずれかを使用して、自分自身で疑問符を逃した方が簡単です。

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 
+0

ありがとうございました。なぜ自分でエスケープするのが単一のバックスラッシュを提供するのですが、 're.escape'を使用すると二重になりますか?この相違には何らかの重要性がありますか?実際には私が探している部分文字列が何であるか分からないので、私はre.escapeを使用します。 – wim

+0

@wim:自分自身をエスケープするためには、自分がうんざりしていて、 'r '\?と' '(生の文字列リテラルを指定する)か'' \\?and'' '\?と'を含む文字列を意味します。これは疑問符と 'と'をマッチさせた正規表現を意味します)。 're.escape'は2つのバックスラッシュを表示します。これは' \?PythonのREPL pretty-printingはそれをPythonプログラムで使うことができる形式、 '' \\?and''に変換します。 – ruakh

+0

@wim:間違いなく(より完全な)私の答えを更新しました。 – ruakh

0

パターン全体をエスケープしている場合は、普通は正規表現なしでfindを使用してください。

x.find('?and') 

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

>>> if x.find('?and') != -1: 
... print "Match!" 
... 
Match! 
+1

通常、 '大文字列の部分文字列'しかし、私はpexpectインターフェイスで作業する必要があります。 – wim

関連する問題