正则表达式查询子字符串

时间:2019-03-12 17:09:28

标签: python regex

我正在寻找与特定查询的子字符串匹配的正则表达式(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:.*和否定的(?!:)

是否有一种干净的方法来满足列出的所有要求?

1 个答案:

答案 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)