2016-09-17 3 views
2

Использование Python 3, простой скрипт, вроде следующего должен работать, как задумано, но, как представляется, подавиться Юникода строки EMOTE:Python 3 Regex и 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!") 

Если я заменить слово «лиса» для содержимое фразовой переменной, шаблон действительно соответствует. Я был озадачен тем, почему он не любит эту конкретную строку, хотя мои экспедиции в руководство и переполнение стека не освещали проблему. Из всего, что я могу сказать, 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 при совпадении фраз в файле конфигурации, иначе я бы просто использовал «if string in string») –

+0

Не могли бы вы задать новый вопрос с точными требованиями? Что вы подразумеваете под символом 'I * * границы слова? –

+0

Это та же проблема. Предполагая, что «фраза» не жестко закодирована, удаление окружающего \ b знаменует проблему Сканторпа. –