根据表达式匹配进行过滤

时间:2015-07-02 17:04:47

标签: python regex nlp

我一直在梳理正则表达式相关的网站和教程,以弄清楚如何实现这一点,但遗憾的是仍然无法清楚地掌握正则表达式。我有已经被标记化的论坛帖子,并且我试图根据可能有年龄相关信息的帖子过滤它们。

例如,我使用此代码段尝试过滤:

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'])

但是当与第一个字符串匹配时,这将返回一个空列表。

代码片段有什么问题?有哪些指针有助于我的过滤使用正则表达式匹配?

2 个答案:

答案 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}).*'