我想有一个正则表达式模式来匹配表情符号":)",":(".还应该捕获重复的表情符号,如":) :)",":) :("但过滤掉无效的语法,如":( (".
我有这个,但它匹配":(("
bool( re.match("(:\()",str) )
Run Code Online (Sandbox Code Playgroud)
我可能在这里遗漏了一些明显的东西,我想为这个看似简单的任务提供一些帮助.
我认为它最终"点击"了你在这里询问的内容.看看下面的内容:
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);
Run Code Online (Sandbox Code Playgroud)
原始代码的问题在于你的正则表达式是错误的:(:\().让我们分解吧.
外面的括号是"分组".如果你要进行字符串替换,它们就是你所引用的,并且用于同时对字符组应用正则表达式运算符.所以,你真的在说:
( 开始一个小组
:\( ...做正则表达式的东西......这:不是正则表达式保留字符,所以它只是一个冒号.的\是,它的意思是"下面的字符是文字,而不是一个正则表达式运算符".这被称为"逃逸序列".正则表达式完全解析为英语
( 开始一个小组
: 一个冒号角色\( 左括号字符) 结束小组我使用的正则表达式稍微复杂一些,但并不坏.让我们分解一下:^(:\(|:\))+$.
^并分别$表示"行的开头"和"行的结尾".现在我们......
^ 行的开头
(:\(|:\))+ ...做正则表达式的东西......$ 行结束...所以它只匹配构成整行的东西,而不是简单地出现在字符串的中间.
我们知道(并)表示分组.+意思是"其中一个".现在我们有:
^ 行的开头( 开始一个小组
:\(|:\) ...做正则表达式的东西......) 结束小组+ 匹配一个或多个$ 行结束最后,有|(管道)操作员.它的意思是"或".因此,应用我们从上面知道的关于转义字符的内容,我们已准备好完成翻译:
^ 行的开头( 开始一个小组
: 一个冒号角色\( 左括号字符| 要么
: 一个冒号角色\) 右括号字符) 结束小组+ 匹配一个或多个$ 行结束我希望这有帮助.如果没有,请告诉我,我很乐意通过回复编辑我的答案.