我一直在梳理正则表达式相关的网站和教程,以弄清楚如何实现这一点,但遗憾的是仍然无法清楚地掌握正则表达式。我有已经被标记化的论坛帖子,并且我试图根据可能有年龄相关信息的帖子过滤它们。
例如,我使用此代码段尝试过滤:
re.search(r'.*(daughter|ds|son|dd|) (is|was|is turning|turned) ([0-9]{2})*', post)
这适用于文本,例如字符串
'my son was 7 when this incident occurred'
但也在字符串上
'is'
过滤,
r = re.compile('.*(daughter|ds|son|dd|)(is|was|is turning|turned)([0-9]{2}).*')
filter(r.match, ['my daughter is 7', 'is'])
但是当与第一个字符串匹配时,这将返回一个空列表。
代码片段有什么问题?有哪些指针有助于我的过滤使用正则表达式匹配?
答案 0 :(得分:1)
要纠正的事情:
1 - 在你的正则表达式中:
.*(daughter|ds|son|dd|)(is|was|is turning|turned)([0-9]{2}).*
您没有考虑单词之间的空格字符,因此它将是:
.*(daughter|ds|son|dd|).*(is|was|is turning|turned).*([0-9]{2}).*
^^ ^^
2 - 在年龄组中,您要求仅查找由两个数字组成的年龄,因此7
将不匹配,因此您必须这样做:
.*(daughter|ds|son|dd|).*(is|was|is turning|turned).*([0-9]{1,2}).*
^
样本:
>>> r = re.compile('.*(daughter|ds|son|dd|).*(is|was|is turning|turned).*([0-9]{1,2}).*')
>>> l =filter(r.match, ['my daughter is 7', 'is'])
>>>
>>>
>>> l
['my daughter is 7']
>>>
答案 1 :(得分:0)
在你发布的第一个正则表达式中:
'.*(daughter|ds|son|dd|) (is|was|is turning|turned) ([0-9]{2})*'
...它会贪婪地匹配任何东西(包括任何东西,因为你在第一组中的最后一个管道之后什么都没有)并点击'是'。然后它会寻找一个空格(在')之间(',然后因为你最后有一个'*',它会抓到0-9两次,零次或多次。这就是为什么'是'正在捕捉。
试试这个:
'.*(daughter|ds|son|dd)\s+(is|was|is turning|turned)\s+([0-9]{1,2}).*'