我有一个关键字列表,希望提取文档中可以找到的所有关键字。一个关键字可以是另一个关键字的子字符串。我试着用re.findall
函数提取,但得到的要么是一个关键字,要么是关键字的子字符串。如果"A"one_answers"A B"是关键字,我想提取两者。
以一个简化的案例为例:
该文档为"A B C D"
。关键字为"A", "B", "A B"
。我的正则表达式模式的输出如下:
string = "A B C D"
regex = 'A B|A|B'
re.findall(regex, string)
>>> ['A B']
string = "A B C D"
regex = 'A|B|A B'
re.findall(regex, string)
>>> ['A', 'B']
预期输出为
['A', 'B', 'A B']
更新:类似的帖子建议使用新的Python正则表达式模块来解决重叠的示例。
import regex as re
re.findall(r'A\ B|B\ C', 'A B C', overlapped=True)
>>> ['A B', 'B C']
然而,该解决方案不能解决一个模式是另一个模式的子串的情况:
import regex as re
re.findall(r'A\ B|A', 'A B C', overlapped=True)
>>> ['A B']
预期:
>>> ['A B', 'A']
PS:更具体地说,我的regex模式类似于"(?<!w)A\ B(?!w)|(?<!w)A(?!w)"
,但我认为简化的情况更清楚。
在一个关键字是另一个关键字的子字符串的情况下,您将需要迭代您的关键字,因为使用regex进行匹配总是会在字符串中的给定点选择一个或另一个(大多数模块,如re
,会选择交替中的第一个匹配-请参阅此处(,但决不能同时选择两者。您可以迭代关键字,以确保使用以下代码找到所有匹配项:
import re
string = "A B C D"
keys = ["A", "B", "A B"]
matches = []
for k in keys:
matches += re.findall(re.escape(k), string)
print(matches)
输出
['A', 'B', 'A B']
Videone 演示
此模式将在字符串"中找到3个匹配项;A B">
我们寻找一个具有对bA
的回顾和对Bb
的前瞻的空间。问题是第二个匹配返回的是空格,而不是字符串A B
您必须用A B
替换空间
(bAb)|((?<=(bA)) (?=Bb))|(bBb)