【问题标题】:Python regex: return the whole sentence with a certain word in it from period to periodPython正则表达式:从句点到句点返回带有某个单词的整个句子
【发布时间】:2016-06-08 10:20:45
【问题描述】:

下面是我要处理的句子。它由以前面两个散列 (##2312435) 和剩余文本开头的 ID 组成。我需要一个正则表达式,它可以在其中找到带有单词likely 的句子,并检索整个句子加上 ID。

句子:

##2312435 乔恩不在家。约翰很可能会在午夜之后回家。另一个不相关的句子。 ##2233442 马克很生气。马克今晚可能会喝啤酒。

我设法写了这个:

(?=.\*((?<=##)\d+))(?=.*([^.]+(likely)+[^.]+))

但这并不能检索完整的句子。

预期结果如下所示:2312435 John 可能会在午夜后回家,2233442 Mark 可能会在今晚喝啤酒

我问这个只是为了一般知识,因为我正在努力掌握环视。我已经在没有正则表达式的情况下解决了这个问题,但我想我可以试一试并尝试使用正则表达式检索所需的信息。谢谢

【问题讨论】:

  • 你知道你不需要正则表达式吗?
  • 是的,我确实意识到,没有他们我已经做到了,但我想练习一下正则表达式,但无法解决这个问题。
  • 好的。可能想在您的帖子中添加它,并请添加您希望您的正则表达式检索的内容(示例)
  • ##likely 之后可以出现多个句子,并且 id 在句子本身中。你想要##id 和这些句子中的每一个,还是只想要第一个?
  • 他们每个人,谢谢。

标签: python regex text-analysis


【解决方案1】:

所以它非常丑陋,并且仅在只有一个带有单词likely的句子的情况下才有效:

re.findall(r'##(\d+)(?:[^#]*\.)*([^#.]*?likely[^#.]*?)\.', text, re.IGNORECASE)

# Output:
#[('2312435', ' John is likely to come home after midnight'),
# ('2233442', ' Mark is likely to have a beer tonight')]

【讨论】:

    【解决方案2】:
    p = re.compile(r'^##\d+.*likely.*$')
    res = p.match(t).group().replace('##','')
    

    例如,

    >>> t = '##2312435 Jon is not home. John is likely to come home after midnight. Another not related sentence. ##2233442 Mark is very angry. Mark is likely to have a beer tonight.'
    >>> p = re.compile(r'^##\d+.*likely.*$')
    >>> res = p.match(t).group().replace('##','')
    >>> print res
    2312435 Jon is not home. John is likely to come home after midnight. Another not related sentence. 2233442 Mark is very angry. Mark is likely to have a beer tonight.
    

    【讨论】:

      【解决方案3】:

      这个任务的任何正则表达式看起来都很难看,但我们至少可以让它高效。

      基本的正则表达式是匹配## + 数字,捕获这些数字,然后匹配任何不是## + 数字的文本,然后是likely,然后再匹配任何不是## + 数字的文本.

      ##(\d+)\s*((?:(?!##\d).)*\blikely\b(?:(?!##\d).)*)
      

      请参阅regex demo(?:(?!##\d).)* 是一个缓和的贪婪令牌,对于正则表达式引擎来说相当沉重。

      我们可以展开它以提高性能,例如:

      ##(\d+)\s*([^#]*(?:#(?!#\d)[^#]*)*\blikely\b[^#]*(?:#(?!#\d)[^#]*)*)
      

      another demo

      这还是没有那么高效,如果你不需要检查整个单词likely,你可以使用

      ##(\d+)\s*([^#l]*(?:#(?!#\d)[^l#]*|l(?!ikely)[^l#]*)*likely[^#]*(?:#(?!#\d)[^#]*)*)
      

      another regex

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-19
        • 2014-11-22
        • 1970-01-01
        • 2021-09-18
        • 2021-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多