Обнаружить смайлик в предложении с помощью регулярного выражения Python

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

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

1 ответ

Решение

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

  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, Это может помочь поставить пробелы вокруг выражения, но тогда вы не сможете подобрать смайлики с пунктуацией. Первый подход является более мощным и ловит смайлики, второй подход не будет соответствовать, но только до тех пор, пока они следуют определенной схеме. Вы можете использовать тот же подход для "восточных" смайликов, но он не будет работать для строго симметричных, таких как =^_^=, поскольку это не обычный язык. Второй подход, с другой стороны, легче дополнить новыми смайликами, поскольку вам просто нужно добавить их в список.

Другие вопросы по тегам