【问题标题】:Filter based on expression match基于表达式匹配的过滤器
【发布时间】:2015-07-02 17:04:47
【问题描述】:

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

比如我用这个sn-p来尝试过滤:

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

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

代码 sn-p 有什么问题,有哪些指针可以帮助我过滤正则表达式匹配?

【问题讨论】:

  • 如果输入字符串正好是is,你的正则表达式将如何匹配isregex101.com/r/oY2sI2/3
  • 我不认为它匹配 "is" 事实上它绝对不匹配(至少在 python 中)
  • 所以你想从字符串中提取年龄还是什么?
  • 我更新了我的帖子以反映我过去过滤的内容。现在,我只想过滤所有包含该表达式的帖子。
  • 您已经发布了两个表达式。要修复第一个问题,请在最后的 * 之前添加一个 .。要修复第二个,请添加如下空格:'.*(daughter|ds|son|dd|) (is|was|is turning|turned) ([0-9]{2}).*'。此外,如果您不想被限制在两位数的年龄,您可以选择更现实的[0-9]{1,3}

标签: python regex nlp


【解决方案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']
>>> 

【讨论】:

    【解决方案2】:

    在您发布的第一个正则表达式中:

    '.*(daughter|ds|son|dd|) (is|was|is turning|turned) ([0-9]{2})*'
    

    ...它会贪婪地匹配任何东西(包括什么都没有,因为在第一组的最后一个管道之后你什么都没有)并点击“是”。然后它会寻找一个空格(在')('之间,然后因为最后有一个'*',它会捕获0-9两次,零次或更多次。这就是'is'捕获的原因。

    试试这个:

    '.*(daughter|ds|son|dd)\s+(is|was|is turning|turned)\s+([0-9]{1,2}).*'
    

    【讨论】:

      猜你喜欢
      • 2017-02-15
      • 2016-11-28
      • 2019-10-06
      • 1970-01-01
      • 2018-02-18
      • 2021-07-05
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      相关资源
      最近更新 更多