我正在寻找与特定查询的子字符串匹配的正则表达式(Python),直到出现另一个子字符串为止。为了更好地理解这一点,我提供了一些示例:
# Query 1
title:chicago bullie
在每个查询中,我的目标是捕获title
及其后的字符串。我从捕获整个查询title:.*
的正则表达式title:chicago bullie
开始。通过包含其他元素,查询变得更加复杂:
# Query 2
title:chicago bullie author:adam
在这种情况下,查询title:.*
不再起作用,因为我的目标是仅捕获title:chicago bullie
并排除其他元素author:adam
。换句话说,我要捕获title
关键字,然后捕获一个或多个字符串,直到查询结束或出现另一个关键字(例如author,year等)为止。请注意,关键字后总是跟随:
和一个或多个字符串。查询中可能还包含关键字AND
以表示最后一个关键字:
# Query 3
title:chicago bullie AND author:adam
我的想法是使用否定前瞻来捕获子字符串title:<string(s)>
,直到字符串结束或出现另一个关键字(后跟:
和其他字符串)。我想出了正则表达式title:.* (?!:)
,但是我不确定这是否是实现此目的的最佳方法。它确实适用于所有示例,但带有AND
关键字的示例除外。
# Query 3
type:action title:chicago bullie one author:adam
Captured group: title:chicago bullie
# Query 4
type:action title:chicago bullie one AND author:adam
Captured group: title:chicago bullie AND
尽管正则表达式适用于不带AND
关键字的查询,但我仍然认为该解决方案不适用于这些情况。请注意,有一个空格字符分隔title:.*
和否定的(?!:)
。
是否有一种干净的方法来满足列出的所有要求?
答案 0 :(得分:0)
怎么样:
import re
PATT = r'.*?(title:.*?)(\w+:|AND|$)'
MYRE = re.compile(PATT, re.M)
ans = MYRE.findall(c)
ans = [x[0] for x in ans]
print(ans)