使用带有 \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。
【讨论】:
太好了,成功了!谢谢。我会再次阅读match
和 findall
文档。
@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']
删除捕获组,以便一次捕获单个短语。我还稍微优化了你的正则表达式,因为你不需要寻找childrens
和childs
(这是不正确的语法!)。
详情
\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 的正则表达式来匹配字符串中的不同短语[重复]的主要内容,如果未能解决你的问题,请参考以下文章