Python 使用正则表达式标记最短的重叠匹配

Python 使用正则表达式标记最短的重叠匹配,python,regex,Python,Regex,这显示了如何使用正则表达式查找最短的重叠匹配。显示了如何获得最短匹配,但我正在努力寻找最短匹配并标记其位置,或者用另一个字符串替换它 所以在给定的模式中 A|B|A|F|B|C|D|E|F|G 我想找到的模式是: my_pattern = 'A.*?B.*?C' 我如何识别最短的匹配并在原始给定模式中标记它,如下所示 A|B|[A|F|B|C]|D|E|F|G 或替代: A|B|AAA|F|BBB|CCC|D|E|F|G 我建议与re.sub一起使用: >>> p=re

这显示了如何使用正则表达式查找最短的重叠匹配。显示了如何获得最短匹配,但我正在努力寻找最短匹配并标记其位置,或者用另一个字符串替换它

所以在给定的模式中

A|B|A|F|B|C|D|E|F|G
我想找到的模式是:

my_pattern = 'A.*?B.*?C'
我如何识别最短的匹配并在原始给定模式中标记它,如下所示

A|B|[A|F|B|C]|D|E|F|G
或替代:

A|B|AAA|F|BBB|CCC|D|E|F|G
我建议与
re.sub
一起使用:

>>> p=re.findall(r'(?=(A.*?B.*?C))',s)
>>> re.sub(r'({})'.format(re.escape(min(p, key=len))),r'[\1]',s,re.DOTALL)
'A|B|[A|F|B|C]|D|E|F|G'

一种方法是在
A
B
之间使用前瞻,然后像这样使用
B
C

import re
p = re.compile(ur'A(?:(?![AC]).)*B(?:(?![AB]).)*C')
test_str = u"A|B|A|F|B|C|D|E|F|G"
result = re.sub(p, u"[$0]", test_str)
# A|B|[A|F|B|C]|D|E|F|G

test_str = u"A|B|C|F|B|C|D|E|F|G"
result = re.sub(p, u"[$0]", test_str)
# [A|B|C]|F|B|C|D|E|F|G

您可以使用这个简单的正则表达式。替换为
[\1]

x=“A | B | A | F | B | C | D | A | B | C”

print re.sub((“+re.escape(min(re.findall(r)”(A[^A]*?B[^B]*?C)”,x,key=len))+”,r“[\1]”,x)

注意,
[^A]*
可能匹配
BC
。你能试试
A | B | C | F | B | C | D | E | F | G
吗?它必须匹配
A | B | C
!!是吗?@Kasra它将匹配
A | B | C
,因此,你的答案anubhava的答案不是这个问题的正确答案!正如你可能知道的,蒂姆·皮耶茨克是顶级雷格克斯回答者!!!他已经给出了答案!您必须注意,您需要匹配最小匹配项,因此在一个包含大量组合的字符串中,
a.*B.*C
您需要最小匹配项,并且不可能用一行正则表达式找到它!!!!还可以看到@Kasra编辑的这个。现在它将给出正确的答案。这更有效,因为如果输入是
A | A | B | B | C | C | F | D | E | F | G
,那么你的正则表达式将找到两个匹配项,因为这将立即找到正确的一项:)请注意
是python注释,而不是
//code>
A | B | F | B | C | A | D | B | C | F | G
?或者是另一个字符串,它有许多组合的
ABC
和其他字母?你能解释一下这个模式如何匹配最小值吗?
(A[^A]*?B[^B]*?C)