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

cod*_*res 7 python regex

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

我有这个,但它匹配":(("

bool( re.match("(:\()",str) ) 
Run Code Online (Sandbox Code Playgroud)

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

Lyn*_*mon 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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

:不是正则表达式保留字符,所以它只是一个冒号.的\是,它的意思是"下面的字符是文字,而不是一个正则表达式运算符".这被称为"逃逸序列".正则表达式完全解析为英语

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

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

^并分别$表示"行的开头"和"行的结尾".现在我们......

  • ^ 行的开头
    • (:\(|:\))+ ...做正则表达式的东西......
  • $ 行结束

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

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

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

最后,有|(管道)操作员.它的意思是"或".因此,应用我们从上面知道的关于转义字符的内容,我们已准备好完成翻译:

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

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