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)