在python中使用正则表达式捕获表情符号

时间:2013-01-28 20:57:38

标签: python regex

我想要一个正则表达式模式来匹配表情符号“:)”,“:(”。它还应该捕获重复的表情符号,如“:) :)”,“:) :(”但过滤掉无效的语法,如“:((”。

我和我有这个,但它匹配“:((”

bool( re.match("(:\()",str) ) 

我可能在这里遗漏了一些明显的东西,我想为这个看似简单的任务提供一些帮助。

5 个答案:

答案 0 :(得分:8)

我认为最终"点击"正是你在这里问的问题。看看下面的内容:

import re

smiley_pattern = '^(:\(|:\))+$' # matches only the smileys ":)" and ":("

def test_match(s):
    print 'Value: %s; Result: %s' % (
        s,
        'Matches!' if re.match(smiley_pattern, s) else 'Doesn\'t match.'
    )

should_match = [
    ':)',   # Single smile
    ':(',   # Single frown
    ':):)', # Two smiles
    ':(:(', # Two frowns
    ':):(', # Mix of a smile and a frown
]
should_not_match = [
    '',         # Empty string
    ':(foo',    # Extraneous characters appended
    'foo:(',    # Extraneous characters prepended
    ':( :(',    # Space between frowns
    ':( (',     # Extraneous characters and space appended
    ':(('       # Extraneous duplicate of final character appended
]

print('The following should all match:')
for x in should_match: test_match(x);

print('')   # Newline for output clarity

print('The following should all not match:')
for x in should_not_match: test_match(x);

原始代码的问题在于您的正则表达式错误:(:\()。让我们分解吧。

外部括号是"分组"。如果您要进行字符串替换,它们是您引用的内容,并且用于同时对字符组应用正则表达式运算符。所以,你真的在​​说:

  • (开始一个小组
    • :\( ...做正则表达式的东西......
  • ')'结束小组

:不是正则表达式保留字符,所以它只是一个冒号。 \是,并且它意味着"以下字符是文字​​,而不是正则表达式运算符"。这被称为"转义序列"。完全解析为英语,你的正则表达式说

  • (开始一个小组
    • :冒号角色
    • \(左括号字符
  • )结束小组

我使用的正则表达式稍微复杂一些,但并不坏。让我们分解一下:^(:\(|:\))+$

^$表示"行的开头" "线的末端"分别。现在我们有......

  • ^行首
    • (:\(|:\))+ ...做正则表达式的东西......
  • $行尾

...所以它只匹配构成整行的东西,而不是简单地出现在字符串的中间。

我们知道()表示分组。 +表示"其中一个"。现在我们有:

  • ^行首
  • (开始一个小组
    • :\(|:\) ...做正则表达式的东西......
  • )结束小组
  • +匹配此
  • 中的一个或多个
  • $行尾

最后,有|(管道)运算符。这意味着"或"。因此,应用我们从上面了解的有关逃避字符的内容,我们已准备好完成翻译:

  • ^行首
  • (开始一个小组
    • :冒号角色
    • \(左括号字符
  • |
    • :冒号角色
    • \)右括号字符
  • )结束小组
  • +匹配此
  • 中的一个或多个
  • $行尾

我希望这会有所帮助。如果没有,请告诉我,我很乐意通过回复来编辑我的答案。

答案 1 :(得分:3)

可能是这样的:

re.match('[:;][)(](?![)(])', str)

答案 2 :(得分:2)

试试(?::|;|=)(?:-)?(?:\)|\(|D|P)。没有进行过广泛的测试,但似乎与正确的测试相匹配而不是更多......

In [15]: import re

In [16]: s = "Just: to :)) =) test :(:-(( ():: :):) :(:( :P ;)!"

In [17]: re.findall(r'(?::|;|=)(?:-)?(?:\)|\(|D|P)',s)
Out[17]: [':)', '=)', ':(', ':-(', ':)', ':)', ':(', ':(', ':P', ';)']

答案 3 :(得分:0)

我从这里发表的评论和答案中得到了我想要的答案。

re.match("^(:[)(])*$",str)

感谢所有人。

答案 4 :(得分:0)

re.search(r"^[(>:#;=*[8|\-B/\\@<~^%$LXoO0}3Vb][a-zA-Z0-9',v(>:#;=*+[8|\-B/\\@<~^%$LXoO0}3Vb)]*$",any_emoji)

匹配此网站上的大部分表情符号http://www.emoticonr.com/filter/a 祝你好运!!