2017-11-15 1 views
3

Ich mag mit einem String mit reinen Zahlen, wie ‚2324235235980980‘ mit einem Muster, ein Muster entsprechen, wie, wie unten beschrieben:Python Regex: Wie wiederhole ich Gruppen in einer Zeichenfolge?

Das Muster ‚2-6-8-7-4‘ ist, in denen die Muster beginnt mit 2, Übergang zu 6, entweder Selbstschleife bei 6 oder Transit zu 8, dann könnte es zwischen 6 und 8 hin und her gehen, könnte sich bei 8 selbst umschlingen, oder könnte bis 7 durchgehen. Und das gleiche für 7. Eine weitere Sache für 7 ist 7-8-6-8-7 könnte passieren. Schließlich könnte 7 4 erreichen, sobald es 4 erreicht, ist das Muster fertig. Wenn es während des Prozesses andere Punkte erreicht, muss es erneut mit 2 beginnen, um gezählt zu werden. Ich benutze

import re  
re.findall(r'(2((6+8+)+)7)', test_string) 

die Ausgabe enthält ‚2666686888668887‘, aber wenn ich 4 hinzufügen, ich weiß nicht, die Syntax, dies zu kompilieren. Hat jemand eine Idee? Danke vielmals!

+0

Wenn du sagst "dann könnte es zwischen 6 und 8 hin und her gehen, könnte bei 8 eine Selbstschleife haben, oder könnte zu 7" durchgehen bedeutet das, dass es 6-8-6-7 gehen könnte oder muss Geh zurück zu 8 bevor du zu 7 gehst? – CAustin

+0

Wenn Sie "dasselbe für 7" sagen, worauf beziehen Sie sich dann? 8s Eigenschaft, zwischen 6 und sich hin und her zu gehen? Es wäre hilfreich, wenn Sie eine Liste gültiger und ungültiger Strings bereitstellen würden, die so viele Kantenfälle wie möglich abbilden. – CAustin

+0

Warum das [perl] -Tag, wenn es eine Python-Frage ist? – tinita

Antwort

1

Ich denke, das leichter als ursprünglich erwartet erreicht ist:

26[68]+?[687]+?4

2-Follow-by-6-Follow-by-6 | 8-Follow-by-6 | 8 | 7 - gefolgt von-4.

Der einzige nicht so offensichtliche Teil ist, das Muster faul zu machen.

Hier ist eine noch bessere Muster:

\b26?([^7]6|8|[^6]7)+?4\b

2-gefolgt-für- (not7) 6 | 8 | (not6) 7-gefolgt durch 4.

+0

Das ist brilliant! Perfekt mein Problem lösen! Vielen Dank! –

+0

Warte, es gibt ein Problem. Wenn ich die Zeichenfolge '26876874' teste, stimmt sie mit dem überein, was nicht übereinstimmen sollte. Sie können NICHT von 7 auf 6 in einem Schritt übertragen. Nur "7-8-6-8-7-4" würde passieren, nicht "7-6-8-7-4". Hast du eine Idee, das zu beheben? –

+0

Willkommen. Fühlen Sie sich frei zu akzeptieren und upvote. – wp78de

0

Ich weiß nicht, ob ich verstehe, was Sie brauchen, aber vielleicht kann dies für Sie arbeiten:

string = "2666686888668887748926874" 
index = [(m.start(0), m.end(0)) for m in re.finditer(r'2(6+8+)+7+\1?4', string)] 
print(index) 

Prints: [(0, 18), (20, 25)].

Ist eine Liste von Tupeln mit dem Start- und Ende-Index für jedes Auftreten.

+0

Dies kann für meine weitere Erkundung hilfreich sein. Danke für deine Arbeit! –

Verwandte Themen