正则表达式获取前一个词后跟 python 中的一个短语

Regex to get previous word followed by a phrase in python

gun store 之前,我需要提取 local 一词。但是,由于使用了 split,下面的函数没有返回它。有什么办法可以解决这个问题吗?

消息来源如下:据 2019 年 12 月 30 日报道,在首都地区迈普,一群至少 10 名暴徒试图抢劫当地一家枪支店。

函数如下:

    regex_filter = r'local|dozen|several|looted'
    property_key = r"\b(gun store|establishments|supermarket)\b"
    source= source.split()
    for i, w in enumerate(source):
        if (re.search(property_key, w)):
            if re.match(re.compile(regex_filter, flags=re.IGNORECASE), source[i-1]):
                return source[i-1]```

我建议用

提取property_key中列出的任何单词之前的单词
re.search(r"(\S+)\s+(?:gun store|establishments|supermarket)\b", text)

或者,如果单词由单词字符组成,并且单词之间可以有任何 whitespace/punctuation:

re.search(r"([^\W_]+)[\W_]+(?:gun store|establishments|supermarket)\b", text)

参见regex demo

(\S+)\s+将一个或多个非空白字符匹配并捕获到Group 1中,然后再匹配一个或多个空白字符,而([^\W_]+)[\W_]+将一个或多个字母或数字匹配并捕获到Group 1中1 然后匹配一个或多个非单词或下划线字符。

Python demo:

import re
rx = r"(\S+)\s+(?:gun store|establishments|supermarket)\b"
text = "As reported on 30 December 2019, in Maipu, Metropolitan region, a group of at least 10 rioters attempted to loot a local gun store."
m = re.search(rx, text)
if m:
    print(m.group(1))

# => local