使用带有 \b 的正则表达式来匹配字符串中的不同短语[重复]

Posted

技术标签:

【中文标题】使用带有 \\b 的正则表达式来匹配字符串中的不同短语[重复]【英文标题】:Using regex with \b to match varying phrases in strings [duplicate]使用带有 \b 的正则表达式来匹配字符串中的不同短语[重复] 【发布时间】:2018-03-06 01:38:17 【问题描述】:

我正在尝试使用正则表达式匹配一些字符串。我要搜索的是任何谈论某人孩子的字符串。例如:我的儿子、我的女儿、我们的女儿等

所以我用 Python 写了这个:

re.match(r'\b(my|our)\b \b(son|daughter|children|child|kid)s?', 'me and my son were')

但有些与测试句中的my son 不匹配。返回None

我在这里测试了这个正则表达式:https://regex101.com/r/ChAy9e/1,它工作正常(测试用例中的第 5 行)。

我无法弄清楚我做错了什么。

谢谢!

【问题讨论】:

我不认为这个问题是重复的。这个概念可能已经在早些时候得到了回答,但由于我对差异缺乏了解,我自己无法解决问题。如果我已经知道区别,这个问题,原始问题都不会出现。整个目的是在您遇到困难时提供帮助,对吗? 【参考方案1】:

match 仅匹配字符串开头的正则表达式;你需要使用findall方法

>>> re.findall(r'\b(my|our)\b \b(son|daughter|children|child|kid)s?', 'me and my son were')
[('my', 'son')]

匹配 尝试在字符串的 start 处应用模式,返回 一个匹配对象,如果没有找到匹配项,则为 None。

【讨论】:

太好了,成功了!谢谢。我会再次阅读 matchfindall 文档。 @SureshS 很高兴我能提供帮助。如果您觉得我的回答有用,请考虑支持并接受它,谢谢:)【参考方案2】:

正如文尼所说,你需要re.findall。但是,如果您希望将这些短语作为一个元素,则需要稍微修改一下您的正则表达式。试试:

In [1]: re.findall(r'\b(?:my|our)\s+(?:son|daughter|kid)s?|children|child\b', 'me and my son were')
Out[1]: ['my son']

删除捕获组,以便一次捕获单个短语。我还稍微优化了你的正则表达式,因为你不需要寻找childrenschilds(这是不正确的语法!)。

详情

\b          # word boundary
(?:         # open non-capture group
    my          
    |           # 'or' operation
    our         
) 
\s+         # whitespace - one or more
(?:         # open non-capture group
    son        
    |
    daughter
    |
    kid
)
s?          # 's' optional           
|
children
|
child
\b          # word boundary 

【讨论】:

以上是关于使用带有 \b 的正则表达式来匹配字符串中的不同短语[重复]的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式将字符串限制为最短匹配与最长匹配(非贪婪组)?

正则表达式

Perl:转义字符串中的特殊字符以匹配正则表达式

带有\b和国际字符的Javascript正则表达式问题

在 C# 中使用正则表达式匹配 a^n b^n c^n(例如“aaabbbccc”)

正则表达式