2010-11-21 27 views
1

Ich benutze das Muster pat='dd|dddd', und ich dachte, es würde entweder dd oder dddd übereinstimmen.regulären Ausdruck

import re 
re.search(pat,'ddd') 
re.search(pat,'ddddd') 

eine beliebige Anzahl von d (s) passt für die Frage, warum ist es so?

+1

Zusätzlich zu den bereits gegebenen Antworten sollten Sie 're.match' anstelle von' re.search' verwenden, um zu vermeiden, dass Treffer über den Anfang der Zeichenfolge hinaus gefunden werden. (Sie müssen das Ende noch verankern, um Ihr gewünschtes Verhalten zu erhalten, also achten Sie immer noch auf diese anderen Antworten) –

Antwort

10

Sie müssen den regulären Ausdruck irgendwie verankern. Ein regulärer Ausdruck sucht in Strings nach einem Muster. Also wird "dd" in "dddddddd" mit dem Offset 0,1,2,3,4,5,6 gefunden.

Wenn Sie nur ganze Strings abgleichen möchten, versuchen Sie ^dd$.^entspricht dem Anfang einer Zeichenkette, $ entspricht dem Ende. So wird ^(dd|dddd)$ das gewünschte Verhalten haben.

Wenn Sie wollen, dass nur dd oder dddd innerhalb einer Zeichenkette übereinstimmt. Dann könnten Sie verwenden möchten: [^d](dd|dddd)[^d] Welche „alles, was nicht d“ wird passen dann entweder zwei oder vier ds dann „alles, was nicht ist d“

2

Wie bereits von Charles Duffy wies darauf hin, search nicht ist wirklich die Funktion, die Sie verwenden sollten. Versuchen Sie es mit match oder sogar findall.

>>> import re 
>>> re.match('dd|dddd','dd').group() 
'dd' 
>>> re.findall('dd|dddd','dd') 
['dd'] 
>>> re.match('dd|dddd','ddddd').group() 
'dd' 
>>> re.match('dddd|dd','ddddd').group() 
'dddd'