2016-09-17 4 views
2

意図したように、次のような単純なスクリプトを実行する必要がありますが、Unicodeのエモート文字列に窒息して表示されます。Pythonの3正規表現とUnicodeエモート

import re 

phrase = "(╯°□°)╯ ︵ ┻━┻" 
pattern = r'\b{0}\b'.format(phrase) 

text = "The quick brown fox got tired of jumping over dogs and flipped a table: (╯°□°)╯ ︵ ┻━┻" 

if re.search(pattern, text, re.IGNORECASE) != None: 
    print("Matched!") 

私は言葉「キツネ」を置き換えた場合フレーズ変数の内容は、パターンが実際に一致します。私はなぜこの特定の文字列が好きではないのか困惑しています。マニュアルとStack Overflowへの私の探検はこの問題を明らかにしていません。私が知る限りでは、Python 3はこれを問題なく処理する必要があります。

私は痛いほど明白な何かを見逃していますか?

編集:また、境界(\ b)を削除しても、文字列を一致させる機能には影響しません。

答えて

2
(╯°□°)╯ ︵ ┻━┻ 

この表現には角括弧が含まれているため、エスケープする必要があります。それ以外の場合は、グループとして解釈されます。

In [24]: re.search(r'\(╯°□°\)╯ ︵ ┻━┻', text, re.IGNORECASE) 
Out[24]: <_sre.SRE_Match object; span=(72, 85), match='(╯°□°)╯ ︵ ┻━┻'> 

In [25]: re.findall(r'\(╯°□°\)╯ ︵ ┻━┻', text, re.IGNORECASE) 
Out[25]: ['(╯°□°)╯ ︵ ┻━┻'] 

Escape the regex string適切とするようにコードを変更します。

import re 

phrase = "(╯°□°)╯ ︵ ┻━┻" 
pattern = re.escape(phrase) 

text = "The quick brown fox got tired of jumping over dogs and flipped a table: (╯°□°)╯ ︵ ┻━┻" 

if re.search(pattern, text, re.IGNORECASE) != None: 
    print("Matched!") 

そして、それが期待どおりに動作します:笑それを行うだろう

$ python3 a.py 
Matched! 
+0

を。あなたが問題を十分に見つめているときに、それが目に見えないことがあるのは驚くべきことです。しかし、問題を引き起こすと思われる私の特定のケースでは、言葉の境界が必要です。 (目的は、設定ファイルのフレーズを一致させながらScunthorpeの問題を避けることです。そうでなければ "string in string"を使用しています) –

+0

正確な要件で新しい質問を開くことができますか? 「私は*単語境界が必要です」とはどういう意味ですか? –

+0

同じ問題です。 "フレーズ"がハードコーディングされていないと仮定すると、\ bを取り除くことでスカンソープ問題が発生します。 –