2016-06-24 12 views
3

私は現在、現在、次の正規表現パターンに一致することになっている、特定の語句に一致するようにフレームワークを使用するアプリケーションを書いている:Pythonのre.compileカーリー引用符の問題

Say \"(.*)\" 

しかし、私は通知をしました

Say "Hello world!" <-- Matches 
Say “Hello world!” <-- Doesn't match! 

は、私はPythonの正規表現を伝えることができますどのような方法があります:私のユーザーは、自分のOSが時々コピーおよびペースト「カーリー引用符」で、何が起こって終わることは、ユーザーが次の文を提供することをあるという事実について訴えていることこれらの中かっこを同じように扱う定期的な引用符?


編集:

はあなたが非常に簡単にUnicode文字列を使用して正規表現を読み取るためのPythonを伝えることができ判明、私は次のように私のコードを変更し、それが働いた:

u'Say (?:["“”])(.*)(?:["“”])' 

# (?:["“”]) <-- Start non-capturing group, and match one of the three possible quote typesnot return it 
# (.*)   <-- Start a capture group, match anything and return it 
# (?:["“”]) <-- Stop matching the string until another quote is found 
+0

あなたが無視する、またはそれを扱う意味ですかまっすぐ引用符として? – ShadowFlame

+0

@ShadowFlameこれを同じものとして扱います。つまり、使用している現在のマッチ、またはすぐに使用できるコードサンプルを投稿できますか? – Paradoxis

+0

?とPythonのバージョン – ShadowFlame

答えて

4

あなたはあなたはREPLことができるものとして

Say [\"“”](.*)[\"“”] 

:ちょうど正規表現でカーリー引用符を含めることができますPythonのREPLでicateが、それはこのようなものだ:カイルの答えに代わるものとして

>>> import re 
>>> test_str = r'"Hello"' 
>>> reg = r'["“”](.*)["“”]' 
>>> m = re.search(reg, test_str) 
>>> m.group(1) 
'Hello' 
>>> test_str = r'“Hello world!”' 
>>> m = re.search(reg, test_str) 
>>> m.group(1) 
'\x80\x9cHello world!\xe2\x80' 
1

あなたはカーリー引用符を置き換えることにより、あなたの現在の正規表現に文字列を準備することができます: string.replace('“', '"').replace('”', '"')

+0

私はしたいと思いますが、内部的に 're.compile'をどこかで使用する第三者のライブラリを使用しています。これは、一致する前に文字列にアクセスできないことを意味します。 – Paradoxis

+0

つまり、一致した後にのみ文字列にアクセスできます。そうでない場合はどうなりますか? – valignatev

+0

私はそのテキストを入力したユーザーを知ることができません。そのため、パターンが一致しないような問題です – Paradoxis

関連する問題