2015-03-22 12 views
5

Diese post zeigt, wie die kürzeste überlappende Übereinstimmung mit Regex zu finden. One of the answers zeigt, wie die kürzeste Übereinstimmung zu bekommen, aber ich habe Probleme mit finden die kürzeste Übereinstimmung und Mark seine Position, oder ersetzen es mit einer anderen Zeichenfolge.Markieren Sie die kürzeste überlappende Übereinstimmung mit regulären Ausdrücken

So in dem vorgegebenen Muster,

A|B|A|F|B|C|D|E|F|G 

und das Muster I suchen möge ist:

my_pattern = 'A.*?B.*?C' 

Wie kann ich das kürzeste Spiel identifizieren und es in den ursprünglichen vorgegebenen Mustern markiere wie unten ?

A|B|[A|F|B|C]|D|E|F|G 

oder Ersatz:

A|B|AAA|F|BBB|CCC|D|E|F|G 

Antwort

2

Ich schlage vor, Tim Pietzcker's answer zu verwenden, um mit 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' 
2

Eine Möglichkeit, Look-Ahead zwischen A und B und dann B und C wie folgt zu verwenden:

RegEx Demo

+1

Sie beachten Sie, dass '#' Kommentar in Python und nicht '//' –

+0

Dank @BhargavRao, korrigiert. – anubhava

+1

Aha, jetzt ist deine Antwort perfekt für die Abstimmung! –

1
(A[^A]*?B[^B]*?C) 

können Sie diese einfache Regex.Replace von [\1] verwenden.

See Demo

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)

+0

Beachten Sie, dass '[^ A] *' mit 'BC' übereinstimmen kann. –

+2

können Sie versuchen, A | B | C | F | B | C | D | E | F | G'? es muss mit "A | B | C" übereinstimmen !! macht es? – Kasramvd

+0

@Kasra wird es übereinstimmen 'A | B | C' – vks

Verwandte Themen