2017-09-30 4 views
1

Das folgende Python-Code:Regex mit Lookbehind nicht funktioniert mit re.match

import re 

line="http://google.com" 
procLine = re.match(r'(?<=http).*', line) 
if procLine.group() == "": 
    print(line + ": did not match regex") 
else: 
    print(procLine.group()) 

nicht erfolgreich übereinstimmen, und gibt den folgenden Fehler:

Traceback (most recent call last): File "C:/Users/myUser/Documents/myScript.py", line 5, in if procLine.group() == "": AttributeError: 'NoneType' object has no attribute 'group'

Wenn ich die Regex mit nur ersetzen. * Es funktioniert gut, was darauf hindeutet, dass es die Regex ist, die irrtümlich ist, aber auf https://regex101.com/, wenn ich meine Regex und String für Python Geschmack zu testen scheint es gut zu entsprechen.

Irgendwelche Ideen?

+1

Vielleicht möchten Sie 'search' verwenden stattdessen überprüfen [Dokumentation] (https://docs.python.org/ 3/library/re.html # regular-expression-syntax): "Beachten Sie, dass Muster, die mit positiven Lookbehind-Assertions beginnen, am Anfang des gesuchten Strings nicht übereinstimmen; Sie werden wahrscheinlich eher die search() - Funktion verwenden wollen als die match() -Funktion " – niemmi

Antwort

1

Wenn Sie Ihr Lookbehind auf eine Nicht-Erfassung Gruppe konvertieren, sollte diese Arbeit:

In [7]: re.match(r'(?:http://)(.*)', line) 
Out[7]: <_sre.SRE_Match object; span=(0, 17), match='http://google.com'> 

In [8]: _.group(1) 
Out[8]: 'google.com' 

Der Grund ein lookbeind nicht der Fall funktioniert, weil - wie Rawing mentioned-re.match geht davon aus, Start der Suche string, also ein Blick hinter an der Start eines Strings macht keinen Sinn.


Wenn Sie darauf bestehen, ein Lookbehind auf verwenden, wechseln Sie zu re.search:

In [10]: re.search(r'(?<=http://).*', line) 
Out[10]: <_sre.SRE_Match object; span=(7, 17), match='google.com'> 

In [11]: _.group() 
Out[11]: 'google.com' 
+0

Danke, das hat funktioniert, und ich werde dies als Workaround verwenden, aber ich werde es als richtig markieren, um zu sehen, ob jemand w weiß Hy Lookbehinds scheinen mich zu versagen. –

+0

@LostCrotchet Das liegt daran, dass 'match' die Regex am _start der Zeichenkette_ anwendet. Ein Blick * hinter * am Anfang des Strings wird niemals funktionieren. –

+0

@Rawing Es war mein Verdacht, aber ich wollte das nicht schreiben ohne sicher zu sein. Lassen Sie mich wissen, ob es in Ordnung ist, das hinzuzufügen, oder Sie können eine Antwort erstellen. –