在特定单词第一次出现之前提取三个单词
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
我一直在尝试提取第一次出现特定单词之前的三个单词。 例如, 输入:喀拉拉邦高等法院管辖权。 已知词:管辖权。 输出:喀拉拉邦高等法院
我试过下面的常规异常,但没用。
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