2013-12-14 4 views
1

Список смайликов: http://en.wikipedia.org/wiki/List_of_emoticons Я хочу создать регулярное выражение, которое проверяет, существует ли какой-либо из этих смайликов в предложении. Например, «Эй, я хорош :)» или «Я сержусь и грустен :(», но в списке википедии есть много смайликов, поэтому мне интересно, как я могу достичь этой задачи. Я новичок в регулярном выражении. & питонобнаружить смайлик в предложении с использованием regex python

>>> s = "hey there I am good :)" 
>>> import re 
>>> q = re.findall(":",s) 
>>> q 
[':'] 
+0

[This] (http://stackoverflow.com/a/14652535/170339) ответит на ваш вопрос. –

+0

Что касается только совпадений :(и :), но у меня есть огромный список из wikipedia – fscore

+0

, что ответа должно быть достаточно, чтобы направить вас к решению. Не ожидайте полного решения. –

ответ

6

Я вижу два подхода к вашей проблеме:.

  1. Либо вы можете создать регулярное выражение для «общего смайлика» и попытаться соответствовать как можно больше, не делая его чрезмерно сложный и безумный. Например, можно сказать, что у каждого смайлика есть глаза, нос (необязательно) и рот.
  2. Или, если вы хотите сопоставить каждого смайлика из этого списка (и никого другого), вы можете просто взять эти смайлики, избежать каких-либо специальных символов специального выражения и построить огромную дизъюнкцию от них.

Вот код, который вы должны получить начало для обоих подходов:

# approach 1: pattern for "generic smiley" 
eyes, noses, mouths = r":;8BX=", r"-~'^", r")(/\|DP" 
pattern1 = "[%s][%s]?[%s]" % tuple(map(re.escape, [eyes, noses, mouths])) 

# approach 2: disjunction of a list of smileys 
smileys = """:-) :) :o) :] :3 :c) :> =] 8) =) :} :^) 
      :D 8-D 8D x-D xD X-D XD =-D =D =-3 =3 B^D""".split() 
pattern2 = "|".join(map(re.escape, smileys)) 

text = "bla bla bla :-/ more text 8^P and another smiley =-D even more text" 
print re.findall(pattern1, text) 

Оба подхода имеют свои плюсы, минусы, и некоторые общие ограничения. У вас всегда будут ложные срабатывания, как в математическом терминах, например 18^P. Это может помочь помещать пробелы в выражение, но тогда вы не можете сопоставить смайлики с последующей пунктуацией. Первый подход более мощный и улавливает смайлики, второй подход не будет соответствовать, но только до тех пор, пока они будут следовать определенной схеме. Вы можете использовать тот же подход для «восточных» смайлов, но он не будет работать для строго симметричных, например =^_^=, так как это не обычный язык. С другой стороны, второй подход легче расширить с помощью новых смайликов, поскольку вам просто нужно добавить их в список.