Es ist möglich, eine Zeichenwiederholung mit Regex zu vergleichen? Wie? - Python, Regex

Frage:
Ist es möglich, mit Regex ein Wort zu finden, das dasselbe Zeichen an verschiedenen Stellen enthält?

Bedingung:
Alle Wörter haben die gleiche Länge, Sie kennen die Zeichenpositionen (Beispiel 1, 2 und 4) des wiederholten Zeichens, aber Sie wissen nicht, was es ist.

Beispiele:
Ich benutze 6char Wörter in Kleinbuchstaben. Ich würde gerne Wörter zusammenbringen, bei denen der 3. und der 4. Buchstabe gleich sind.

parrot <- match for double r
follia <- match for double l
carrot <- match for double r
mattia <- match for double t
rettoo <- match for double t
melone <- doesn"t match

Ich kann den Quantifizierer [d] {2} nicht verwenden, weil er einer beliebigen Folge von zwei Zeichen entspricht, und was, wenn ich die 2. und die 4. Stelle anstelle von 3. und 4. sage?

Ist es möglich, mit Regex zu tun, was ich will? Wenn ja, wie kann ich das tun?

BEARBEITEN:
Frag in den Kommentaren, ich benutze Python

Antworten:

27 für die Antwort № 1

Sie können dazu eine Rückverweisung verwenden:

(.)1

Dies wird aufeinander folgende Vorkommen jedes Zeichens entsprechen.


Bearbeiten Hier ist ein Python-Beispiel:

import re

regexp = re.compile(r"(.)1")
data = ["parrot","follia","carrot","mattia","rettoo","melone"]

for str in data:
match = re.search(regexp, str)
if match:
print str, "<- match for double", match.group(1)
else:
print str, "<- doesn"t match"

7 für die Antwort № 2

Sie müssen für solche Fälle Rückverweise verwenden. Ich bin mir nicht sicher, welche Sprache Sie verwenden. Ich habe das folgende Beispiel in meinem VI-Editor ausprobiert, um nach einem beliebigen Alphabet zu suchen. Muster Regex: ([a-z])1

Wenn Sie das Beispiel sehen, ist [a-z] das Muster, das Sie verwendensuchen und umschließen das innerhalb der Paranthesis (die Parantheses sollten in einigen Sprachen maskiert sein). Sobald Sie eine Paranthese haben, handelt es sich um eine Gruppe, und Sie können sie an einer beliebigen Stelle in der Regex wiederverwenden, indem Sie 1 verwenden. Wenn es mehr als eine Gruppe gibt, können Sie 1, 2 usw. verwenden. 1 wird durch das ersetzt, was in der ersten gefunden wurde Gruppe.

Vielen Dank Arvind


2 für die Antwort № 3

/(bw*?(w)2.*?b)/

passt jedes Wort mit mindestens einer Zeichenwiederholung an $ 1 ist das Wort $ 2 die erste Wiederholung.


0 für die Antwort № 4

Ja, Sie können das Backreference-Konstrukt verwenden, um die doppelten Buchstaben zu finden.

Der reguläre Ausdruck (?<char>w)k<char>, benannte Gruppen und Backreferencing verwenden,sucht nach benachbarten gepaarten Zeichen. Wenn er auf die Saite angewendet wird, "ich" werde einen kleinen Kaffee haben, "findet er Übereinstimmungen in den Wörtern" Ich werde "," klein "und" Kaffee ". Das Metazeichen w findet jedes einzelne Wortzeichen. Das Gruppierungskonstrukt (?<char>) umschließt den Metazeichen, um den regulären zu erzwingenExpression-Engine, um sich an einen Teilausdruck anzupassen (der in diesem Fall ein einzelnes Zeichen sein wird) und unter dem Namen "char" zu speichern. Das Rückreferenzkonstrukt k<char> bewirkt, dass der Motor den Strom vergleichtZeichen zu dem zuvor übereinstimmenden Zeichen unter "char" gespeichert. Der gesamte reguläre Ausdruck findet erfolgreich eine Übereinstimmung, wenn ein einzelnes Zeichen mit dem vorhergehenden übereinstimmt.