Python正则表达式:从句点到句点返回整个句子中的某个单词

时间:2016-06-08 10:20:46

标签: python regex text-analysis

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

句:

  

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

我设法写了这个:

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

但是这并没有找回完整的句子。

预期结果如下:2312435约翰很可能在午夜后回家,2233442马克很可能今晚有啤酒

我只是因为一般知识而要求这一点,因为我正在努力抓住外表。我已经在没有正则表达式的情况下解决了这个问题,但我认为我可以尝试使用正则表达式来检索所需的信息。谢谢

3 个答案:

答案 0 :(得分:2)

所以它非常难看,只有在只有一个单词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')]

答案 1 :(得分:0)

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.

答案 2 :(得分:0)

此任务的任何正则表达式看起来都很难看,但我们可以使它至少有效。

基本正则表达式是匹配## +数字,捕获这些数字,然后匹配任何非## +数字,然后是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