2017-10-05 1 views
0

Ich benutze Python. Ich möchte einen regulären Ausdruck machen, die die folgenden Beispiele Allos:Python Regex: Symbol + in jedem Buchstaben des gleichen Wortes

Day 
Dday 
Daay 
Dayy 
Ddaay 
Ddayy 
... 

Also, jeden Buchstaben eines Wortes, ein oder mehrere Male. Wie kann ich es einfach schreiben? Gibt es einen Ausdruck, der es leicht macht? Ich habe viele Wörter. Dank

+1

Können Sie uns zeigen, was Sie bereits ausprobiert haben? –

+0

Sie wollen also eine Regex, die "einen oder mehrere Buchstaben" entspricht? Oder etwas anderes? Können Sie ein Beispiel geben für etwas, das Ihre Regex nicht erfüllen sollte? – Kevin

+1

Warum teilen Sie Ihr Wort nicht einfach in ein Array von Zeichen und fügen Sie es nach jedem Zeichen wieder mit '+' zusammen?Du würdest mit 'd + a + y +' enden: https://stackoverflow.com/questions/15418561/convert-a-word-to-a-list-of-chars – ctwheels

Antwort

0

Versuchen /d+a+y+/gi:

  • d+ Spiele d ein oder mehrere Male.
  • a+ Übereinstimmungen a ein oder mehrere Male.
  • y+ Übereinstimmungen y einmal oder mehrmals.
+0

Hallo David, ich denke, das OP gab nur diese Daten als ein Beispiel, um die Art der erlaubten Übereinstimmungen zu zeigen. –

1

Wir können versuchen, die folgenden RegexMuster mit:

^([A-Za-z])\1*([A-Za-z])\2*([A-Za-z])\3*$ 

Das passt und fängt einen einzelnen Buchstaben, durch eine beliebige Anzahl von Vorkommen dieses Schreibens gefolgt. Die \1, die Sie in dem obigen Muster sehen, ist eine Rückreferenz, die den vorherigen übereinstimmenden Buchstaben darstellt (und so weiter für \2 und \3).

Code:

word = "DdddddAaaaYyyyy" 
matchObj = re.match(r'^([A-Za-z])\1*([A-Za-z])\2*([A-Za-z])\3*$', word, re.M|re.I) 

if matchObj: 
    print "matchObj.group() : ", matchObj.group() 
    print "matchObj.group(1) : ", matchObj.group(1) 
    print "matchObj.group(2) : ", matchObj.group(2) 
    print "matchObj.group(3) : ", matchObj.group(3) 
else: 
    print "No match!!" 

Demo

1

Um ein Zeichen ein oder mehrere Male entsprechen können Sie den +quantifier verwenden. Um das vollständige Muster baut dynamisch müssen Sie das Wort Zeichen aufzuspalten und ein + nach jedem von ihnen hinzu:

pattern = "".join(char + "+" for char in word) 

Dann einfach match das Muster Fall unsensibel.

Demo:

>>> import re 
>>> word = "Day" 
>>> pattern = "".join(char + "+" for char in word) 
>>> pattern 
'D+a+y+' 
>>> words = ["Dday", "Daay", "Dayy", "Ddaay", "Ddayy"] 
>>> all(re.match(pattern, word, re.I) for word in words) 
True 
0

Gemäß meiner ursprünglichen Kommentar, wird die unten genau das, was ich zu erklären.

Da Sie in der Lage sein möchten, dies auf viele Wörter zu verwenden, denke ich, dass Sie das suchen.

import re 

word = "day" 

regex = r"^"+("+".join(list(word)))+"+$" 

test_str = ("Day\n" 
    "Dday\n" 
    "Daay\n" 
    "Dayy\n" 
    "Ddaay\n" 
    "Ddayy") 

matches = re.finditer(regex, test_str, re.IGNORECASE | re.MULTILINE) 

for matchNum, match in enumerate(matches): 
    matchNum = matchNum + 1 

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group())) 

Dies funktioniert, indem Sie die Zeichenfolge in eine Liste konvertieren, dann zurück zu String konvertieren, sie auf + Beitritt und das gleiche anhängt. Die resultierende Regex wird ^d+a+y+$ sein. Da die von Ihnen angegebene Eingabe durch Zeilenumbrüche getrennt ist, habe ich re.MULTILINE hinzugefügt.

Verwandte Themen