2013-07-10 7 views
6

Ich möchte Wörter finden, die aufeinanderfolgende Buchstabenpaare mit Regex haben. Ich weiß für nur ein aufeinander folgendes Paar wie Zoo (oo), Puzzle (zz), ordnen (rr), kann es durch '(\w){2}' erreicht werden. Aber wie wäre esPython: Wie finde ich aufeinanderfolgende Buchstabenpaare nach Regex?

  • zwei aufeinander folgende Paare: Komitee (ttee)
  • drei aufeinander folgende Paare: Buchhalterin (ookkee)

edit:

  • '(\w){2}' ist eigentlich falsch , findet es zwei beliebige Buchstaben anstelle eines doppelten Buchstabenpaares.
  • Meine Absicht ist es, die Wörter zu finden, die Buchstabenpaare haben, nicht die Paare.
  • Mit "konsekutiv", ich meine, es gibt keinen anderen Buchstaben zwischen den Buchstabenpaaren.
+1

möglich Duplikat [Return Wörter mit Doppel aufeinander folgenden Buchstaben] (http://stackoverflow.com/ Fragen/9593622/Return-Wörter-mit-Doppel-aufeinanderfolgenden Buchstaben) – ChrisGuest

+0

'\ w {2}' bezieht sich nur auf zwei Buchstaben, 'ab', 'cc' sind beide in Ordnung. – zhangyangyu

+0

tatsächlich, '(\ w) {2}' stimmt mit 2 aufeinanderfolgenden Buchstaben überein, die übereinstimmen oder nicht. Es wird "Zo" auf "Zoo" übereinstimmen. –

Antwort

4

können Sie dieses Muster verwenden:

[a-z]*([a-z])\1([a-z])\2[a-z]* 

die Idee ist Rückreferenzierungen \1 und \2, die auf die Erfassung von Gruppen beziehen zu verwenden.

Beachten Sie, dass (\w){2} zwei Wortzeichen, aber nicht das gleiche Zeichen enthält.

+0

Es funktioniert! Um also Wörter aus drei aufeinanderfolgenden Buchstabenpaaren zu finden, wäre die Regex "[az] * ([az]) \ 1 ([az]) \ 2 [az] * ([az]) \ 3 [az] *", aber es findet nicht nur ** Buchhalter **, sondern auch ** Grünheit **, was die "konsekutive" Regel bricht. Wie vermeide ich das? –

+1

@Teacode: Nein für drei müssen Sie schreiben: '[a-z] * ([a-z]) \ 1 ([a-z]) \ 2 ([a-z]) \ 3 [a-z] *' –

+0

Sie haben Recht! Vielen Dank. Schäm dich für meinen Fehler, ich bin ein totaler Anfänger mit Regex. –

14

Verwenden re.finditer

>>> [m.group() for m in re.finditer(r'((\w)\2)+', 'zoo')] 
['oo'] 
>>> [m.group() for m in re.finditer(r'((\w)\2)+', 'arrange')] 
['rr'] 
>>> [m.group() for m in re.finditer(r'((\w)\2)+', 'committee')] 
['mm', 'ttee'] 
>>> [m.group() for m in re.finditer(r'((\w)\2)+', 'bookkeeper')] 
['ookkee'] 

Überprüfen Sie, ob die Zeichenfolge aufeinanderfolgende Paar enthalten:

>>> bool(re.search(r'((\w)\2){2}', 'zoo')) 
False 
>>> bool(re.search(r'((\w)\2){2}', 'arrange')) 
False 
>>> bool(re.search(r'((\w)\2){2}', 'committee')) 
True 
>>> bool(re.search(r'((\w)\2){2}', 'bookkeeper')) 
True 

Sie auch nicht-Capturing folgenden verwenden können (?:) Version:

(?:(\w)\1){2} 
+0

Ich denke, meine Frage war schlecht gebildet. Anstatt die Buchstabenpaare eines Wortes zu finden, möchte ich wirklich die Wörter (aus einer Wortliste) finden, die aufeinanderfolgende Buchstabenpaare haben. –

+0

@Teacode, ich habe den Code aktualisiert. – falsetru

+0

Danke. Jetzt hab ich es verstanden. '((\ w) \ 2) {3}' ist äquivalent zu '(\ w) \ 1 (\ w) \ 2 (\ w) \ 3' und eleganter! –

0

Weil Sie erwähnt, dass Sie aus einer Liste testen möchten, habe ich als beantwortet eine solche. Mit falsetru Antwort:

newlist = [] 

for word in list: 
    if [m.group() for m in re.finditer(r'((\w)\2)+', word)] != []: 
    newlist.append(word) 

print newlist 
0

Für 2-oder-mehr aufeinander folgende Buchstaben die Regex wird Erkennung: (\w)\1+

Verwandte Themen