在特定单词第一次出现之前提取三个单词

Extracting three words before the first occurrence of a particular word

我一直在尝试提取第一次出现特定单词之前的三个单词。 例如, 输入:喀拉拉邦高等法院管辖权。 已知词:管辖权。 输出:喀拉拉邦高等法院


我试过下面的常规异常,但没用。

m = re.search("((?:\S+\s+){3,}\JURISDICTION\b\s*(?:\S+\b\s*){3,})",contents)
print(m)

您可以为此使用 re,模式可能如下所示:^([\w ]+)Jurisdiction

import re
s = """Kerala High Court Jurisdiction."""
print(re.findall(r"^([\w ]+)Jurisdiction", s)[0].strip().split())
# ['Kerala', 'High', 'Court']

解释:

re.findall(r"^([\w ]+)Jurisdiction", s)

给你['Kerala High Court ']

[0].strip().split()

取上面列表的第一个元素,去掉空格,然后在空格处拆分它。

这里有多种方法:

# Method 1
# Split the sentence into words and get the index of "Jurisdiction"
data = "Word Kerala High Court Jurisdiction"
words = data.split()
new_data = words[words.index('Jurisdiction')-3:words.index('Jurisdiction')]
print(new_data)  # ['Kerala', 'High', 'Court']

# Method 2
# Split the sentence to "Jurisdiction" and the text before into word
data = "Word Kerala High Court Jurisdiction"
new_data = data.split('Jurisdiction')[0].split()[-3:]
print(new_data)  # ['Kerala', 'High', 'Court']


# Method 3
# Using regex
import re

data = "Word Kerala High Court Jurisdiction"
new_data = re.search(r"(\w+\W+){3}(?=Jurisdiction)", data)
print(new_data.group())  # Kerala High Court

  • (){3}:捕获组,重复3次。
    • \w+: 匹配一个单词字符一次到无限次。
    • \W+: 匹配任何不同于单词字符的字符一次到无限次。
  • (?=):正向预测。
  • Jurisdiction:匹配 Jurisdiction.
matches = re.findall(r'(?:\b\w+\s+){3}(?=Jurisdiction)', contents, flags = re.I)
for match in matched:
    print(match)

表达式在单词 'Jurisdiction' 之前查找三个单词。

re.I就是不区分大小写。

您应该使用前瞻性 (?=...) 来检查匹配是否在模式之前。如果您想在匹配中包含单词 Jurisdiction,您可以删除 ?=

关于您尝试的模式:

  • 使用 {3,} 重复 3 次或更多次而不是恰好 3 次
  • 您不必转义 \J
  • 模式以 \s*(?:\S+\b\s*){3,} 结尾,这意味着在匹配 JURISDICTION
  • 之后应该出现重复模式
  • 您在整个模式周围使用捕获组,但您可以只捕获您想要的部分,并匹配之前(或之后)应该出现的内容

要在第一次出现之前提取 3 个词,您可以使用 re.search,并使用捕获组而不是前瞻。

(\S+(?:\s+\S+){2})\s+JURISDICTION\b

模式匹配:

  • ( 捕获 组 1
    • \S+ 匹配 1+ 个非空白字符
    • (?:\s+\S+){2} 重复 2 次匹配 1+ 个空白字符和 1+ 个非空白字符
  • ) 关闭组 1
  • \s+JURISDICTION\b 匹配 1+ 个空白字符,JURISDICTION 后跟单词边界

看到一个regex demo.

例如,使用 re.I 进行不区分大小写的匹配:

import re

pattern = r"(\S+(?:\s+\S+){2})\s+JURISDICTION\b"
s = "Kerala High Court Jurisdiction"

m = re.search(pattern, s, re.I)

if m:
    print(m.group(1))

输出

Kerala High Court