Python-Regex findall提取所有可能是彼此子字符串的模式



我有一个关键字列表,希望提取文档中可以找到的所有关键字。一个关键字可以是另一个关键字的子字符串。我试着用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)

相关内容

  • 没有找到相关文章

最新更新