以下是我要处理的句子。它由ID开头,前面有两个哈希(##2312435
)加上剩余的文本。我需要一个正则表达式,它会在其中找到带有单词likely
的句子,并将检索整个句子加上ID。
句:
## 2312435乔恩不在家。约翰很可能在午夜后回家。另一个不相关的句子。 ## 2233442马克非常生气。马克很可能今晚要喝啤酒。
我设法写了这个:
(?=.\*((?<=##)\d+))(?=.*([^.]+(likely)+[^.]+))
但是这并没有找回完整的句子。
预期结果如下:2312435约翰很可能在午夜后回家,2233442马克很可能今晚有啤酒
我只是因为一般知识而要求这一点,因为我正在努力抓住外表。我已经在没有正则表达式的情况下解决了这个问题,但我认为我可以尝试使用正则表达式来检索所需的信息。谢谢
答案 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。