2010-12-13 18 views
7

私はPython re modules .searchメソッドを使いこなしています。 curは、Tkinterエントリウィジェットからの入力です。入力ウィジェットに「\」を入力すると、このエラーがスローされます。私は、エラーが何であるか、それをどのように処理するかをすべて確かめるわけではありません。どんな洞察も高く評価されるだろう。Python re "bogus escape error"

se = re.search(cur, tup[0], flags=re.IGNORECASE) 

エラー:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Python26\Lib\Tkinter.py", line 1410, in __call__ 
    return self.func(*args) 
    File "C:\Python26\Suite\quidgets7.py", line 2874, in quick_links_results 
    self.quick_links_results_s() 
    File "C:\Python26\Suite\quidgets7.py", line 2893, in quick_links_results_s 
    se = re.search(cur, tup[0], flags=re.IGNORECASE) 
    File "C:\Python26\Lib\re.py", line 142, in search 
    return _compile(pattern, flags).search(string) 
    File "C:\Python26\Lib\re.py", line 245, in _compile 
    raise error, v # invalid expression 
error: bogus escape (end of line) 

答えて

12

"偽のエスケープ(行末)"は、パターンがバックスラッシュで終わることを意味します。これはTkinterとは関係ありません。対話シェルで簡単にエラーを複製することができます:

>>> import re 
>>> pattern="foobar\\" 
>>> re.search(pattern, "foobar") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/re.py", line 142, in search 
    return _compile(pattern, flags).search(string) 
    File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/re.py", line 241, in _compile 
    raise error, v # invalid expression 
sre_constants.error: bogus escape (end of line) 

解決策はありますか?パターンが単一のバックスラッシュで終わらないようにしてください。

+0

普通の文字のように\を扱うことは可能ですか? r "string"メソッドと同様です。 – rectangletangle

+2

@Anteater7171:バックスラッシュは正規表現にとって特別です。 2つの選択肢があります。ユーザーの正規表現を使用しないか、特殊な意味が削除されるように文字列を変更します。後者の場合、追加のバックスラッシュを加えることがトリックです(つまり、パターン '¥¥'はリテラルのバックスラッシュを意味します)。 –

+0

+1最後のコメントを回答に追加してください。コメントを拡大するには、たとえばre.searchは '' pattern = "foobar \\\\" ''を作ることを意味します。つまり、re.searchのパターン引数が2つになり、正当な正規表現になるように4つのバックスラッシュが必要です。 – ThomasH

3

最初のパラメータ

CUR [0]も文字列である

スニペット列

TUPであります再会する検索するパターンになります。したがって、 'cur'に行の最後にバックスラッシュが含まれていると、無効なエスケープシーケンスになります。おそらく、周りのあなたの引数を入れ替えました(私は[0]ですが、それはあなたのパターンが何であるかTUPわからないのですか?)、あなたは非常にまれとユーザの入力を使用していないとして、それはこの

se = re.search(tup[0], cur, flags=re.IGNORECASE) 

ようにする必要があります正規表現の検索メカニズムを使用している場合を除き、その代わりにエラーを表示することができます。

HTH。

EDIT
ことが報告されたエラーは、あなたが(何bogus escape (end of line)手段である)行の終わりの前にエスケープ文字を使用している、それはあなたのパターンではないバックスラッシュで終わるということです有効なパターン。エスケープ文字(バックスラッシュ)の後ろには別のキャラクタが続かなければなりません。それはそのキャラクタに特別な意味を加えたり、追加したりします。つまり、\*はリテラルアスタリスクに一致しますが、*は直前の文字に0回以上一致します。

+0

私はtup [0]の内容を検索するためにユーザー入力を使用しています。 curは私のパターンです。 – rectangletangle

+1

@Anteater;うまくいけば、curがパターンである場合、すなわちユーザがパターンを入力している場合、それは明らかに不正確であり、ユーザはそれを認識する必要がある。 – falstro

+0

は、ユーザーが正規表現を入力していると考えているかどうかによって異なります。彼らが固定ストリングを入力していると思ったら、コードを修正する必要があります。彼らが正規表現を入力していると思う場合は、式が無効であることを知らされるべきです(しかしうまくいけば、懲罰的ではなく、情報や教えの精神のもとで)。 @ブライアン; –

3

あなたはで「CUR」を検索しようとしている場合は、「TUP [0]」あなたが「してみてください:...除い:...」を介してこれを行う必要がありますブロックの無効なパターンをキャッチする:

try : 
    se = re.search(cur, tup[0], flags=re.IGNORECASE) 
except re.error, e: 
    # print to stdout or any status widget in your gui 
    print "Your search pattern is not valid." 
    # Some details for error: 
    print e 
    # Or some other code for default action. 
12

この問題の解決策は、置き換えテキストとして生の文字列を使用することです。以下は動作しません。

re.sub('this', 'This \\', 'this is a text') 

をそれがエラーをスローします:偽のエスケープ(ラインの終わり)

しかし、次のことがうまく動作します:

re.sub('this', r'This \\', 'this is a text') 

を、質問プログラムの実行時に生成された文字列をPythonの生の文字列に変換する方法は?これはhereの解を見つけることができます。しかし、私はこれを行うための簡単な方法を使用することをお勧めします:上記の方法は、ASCII文字列とUnicode文字列だけを生の文字列に変換できます。さて、これは日付まで私にとって素晴らしい仕事をしています:)