当前位置: 首页 > 面试题库 >

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

窦英武
2023-03-14
问题内容

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

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

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

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


问题答案:

我认为它终于“点击了”您所要询问的内容。看一下下面的内容:

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);

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

外部括号是“分组”。如果要进行字符串替换,它们就是您要引用的内容,并且可将它们一次应用于多个字符组的正则表达式运算符。因此,您实际上是在说:

  • ( 开始一个小组
    • :\( …做正则表达式的东西…
  • ‘)’结束群组

:不是正则表达式保留的字符,因此它只是一个冒号。的\是,它的意思是“下面的字符是文字,而不是一个正则表达式运算符”。这称为“转义序列”。正则表达式表示完全解析为英语

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

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

^和分别$表示“行的开头”和“行的结尾”。现在我们有…

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

…因此它仅匹配组成整行的内容,而不仅仅是在字符串中间出现。

我们知道这一点,()表示一个分组。+表示“其中的一个”。现在我们有:

  • ^ 行首
  • ( 发起一个小组
    • :\(|:\) …做正则表达式的东西…
  • ) 结束小组
  • + 匹配一个或多个
  • $ 行结束

最后是|(管道)运算符。它的意思是“或”。因此,应用我们从上面了解的有关转义字符的知识,我们准备完成翻译:

  • ^ 行首
  • ( 发起一个小组
    • : 冒号
    • \( 左括号字符
  • | 要么
    • : 冒号
    • \) 右括号字符
  • ) 结束小组
  • + 匹配一个或多个
  • $ 行结束

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



 类似资料:
  • 假设我有这个虚拟URL,我需要提取植物及其颜色作为 下面的I have正在按预期捕获我需要的元素,但是当我的URL中的植物少于4株时,它无法捕获任何东西。底部有一个指向regex测试员的链接,其中有示例代码和URL,您可以使用。 如何修改这个正则表达式,使其动态工作,从而在不需要静态URL结构的情况下捕获可用内容。现在,假设我最多只能捕获4株植物(8组) https://regex101.com/

  • 问题内容: 我正在尝试使用Java expr在:之后捕获正确的部分,但是在以下代码中,打印的捕获组是整个字符串,怎么了? 问题答案: 子组的编号从1开始,全文为0。只需循环执行count + 1。

  • 问题内容: 我有一个Python正则表达式,其中包含一个可以出现零次或多次的组-但是当我之后检索组列表时,仅出现最后一个。例: () 这将返回列表(“ g”,) 我需要它返回(’a’,’b’,’c’,’d’,’e’,’f’,’g’,) 那可能吗?我该怎么做? 问题答案: 除了道格拉斯·里德(Douglas Leeder)的解决方案之外 ,以下是解释: 在正则表达式中,组数是固定的。在组后面放置一个

  • 在Python中,如何在非捕获组中捕获组?换句话说,如何重复包含捕获组的非捕获子模式? 例如,捕获导入字符串上的所有包名。例如,字符串: 导入熊猫、操作系统、系统 将返回“pandas”、“os”和“sys”。下面的模式捕获第一个包并到达第二个包: 从这里,我想重复捕获组并匹配以下字符的子模式,即。当我用一个非捕获组包围这个子模式并重复它时: 它不再捕捉里面的群体。

  • 问题内容: 据我所知,MySQL不支持从正则表达式匹配中检索捕获组的值。我发现了一个服务器端扩展(lib_mysqludf_preg),它将添加此功能,但无法在我的环境中安装此扩展。 因此,我正在寻找一种方法来模拟将正则表达式匹配的一部分捕获为SQL查询中的一列。 我的数据如下所示(并且我无法更改服务器上的数据格式): 我正在寻找每行的最后4位数字。数字始终是值的最后一部分,并且始终由点分隔。以下

  • 问题内容: 据我所知,JavaScript中没有所谓的捕获组。获得类似功能的替代方法是什么? 问题答案: ECMAScript 2018将命名捕获组引入了JavaScript正则表达式中。 例: 如果您需要支持较旧的浏览器,则可以使用命名捕获组来处理普通(编号)捕获组,而只需要跟踪编号-如果捕获组中的捕获组顺序很麻烦,正则表达式更改。 我能想到的命名捕获组只有两个“结构”优点: 在某些正则表达式中