我想要一个正则表达式模式来匹配表情符号“:)”,“:(”。它还应该捕获重复的表情符号,如“:) :)”,“:) :(”但过滤掉无效的语法,如“:((”。
我和我有这个,但它匹配“:((”
bool( re.match("(:\()",str) )
我可能在这里遗漏了一些明显的东西,我想为这个看似简单的任务提供一些帮助。
答案 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 祝你好运!!