试图创建一个正则表达式,忽略属于一组字符的字符以及跟随一组字符的单词

2024-04-18 14:54:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我是regex新手,正在尝试在discord中创建一个“Dadbot”,它使用regex在文本频道中用“嗨,我是爸爸”来响应消息。我的问题是,它包括“im”作为一个公认的正则表达式。这本身并不坏;然而,在使用“他”一词的情况下,他接受im。我希望能够修复此正则表达式,以便: -上面写着我是 -包括后面的3个单词,在I'm之后或直到它到达句点

我不确定我写的是否正确。我用regex101.com来检查我的regex,我原来的regex是这样的怪物:“(I'm | Im | I am | Im | I am | I m)\s+([a-zA-z]+)”我使用组来捕获第二个组

我试过的东西

"(I'm|Im|I am|im|i am|i'm)\s+([a-zA-z]+)"
"\bi'?m\s+(\w+)\b"
"/\bi'?m\s+(\w+)\b/gi"

下面是第二组的代码部分

        if dadCheck.search(message.content):
            match = dadCheck.search(message.content).group(2)
            await channel.send("Hi, " + match + ". I'm Dad. ;D")

以下是给定可接受消息的预期结果:

  1. 大家好。我叫布拉德,很酷

  2. 嗨,“帅哥”。我是爸爸


Tags: 消息messagesearchmatchcontentamregex爸爸
2条回答
/(im|i am|i'm)\s(\w*\s?){1,3}/i

Regex是非常棒的,可以完全覆盖您的用例。上面的正则表达式查找I'm标记,然后在一个捕获组中抓取接下来的1-3个单词加上空格,供您参考。它使用的字符串

I'm a cool guy.

Im a cool guy.

i am a cool guy.

i'm a cool guy.

im a cool guy.

im a cool guy and I like to watch football games with friends

这就是我最终找到的答案

\b(\s)?[Ii]((\sa)?|\'{0,1})[mM]\b\s+((\w*\s?)[^\.\!;:\(\)]\w+){1,3}

它捕获了所有的I'm(im,im,I'm,I'm)的变体,并忽略了I'am

唯一的问题是它只捕获单词循环的最后一次迭代。因此,我必须修复捕获组或用于打印捕获组的算法

相关问题 更多 >