Ich schaffe einen regulären Ausdruck Urls zu finden wie /places/:state/:city/whatever
mit re.sub in Python
p = re.compile('^/places/(?P<state>[^/]+)/(?P<city>[^/]+).*$')
Dies funktioniert gut:
import re
p = re.compile('^/places/(?P<state>[^/]+)/(?P<city>[^/]+).*$')
path = '/places/NY/NY/other/stuff'
match = p.match(path)
print match.groupdict()
Drucke {'city': 'NY', 'state': 'NY'}
.
Wie kann ich eine Logdatei verarbeiten, um /places/NY/NY/other/stuff
durch die Zeichenfolge "/places/:state/:city/other/stuff"
zu ersetzen? Ich würde gerne ein Gefühl dafür bekommen, wie viele URLs vom "Städte-Typ" sind, ohne sich darum zu kümmern, dass die Orte (NY
, NY
) spezifisch sind.
kann Der einfache Ansatz scheitern:
import re
p = re.compile('^/places/(?P<state>[^/]+)/(?P<city>[^/]+).*$')
path = '/places/NY/NY/other/stuff'
match = p.match(path)
if match:
groupdict = match.groupdict()
for k, v in sorted(groupdict.items()):
path = path.replace(v, ':' + k, 1)
print path
/places/:city/:state/other/stuff
gedruckt wird, die rückwärts!
Fühlt sich an, als sollte es eine Möglichkeit geben, re.sub
zu verwenden, aber ich kann es nicht sehen.
Sie die dict sortiert haben, so 'city' kommt vor' Zustand 'während der Ersetzung –
@MosesKoledoye ist der Wert von' groupdict() 'garantiert in der gleichen Reihenfolge wie die Übereinstimmungen sortiert (oder eine bestimmte Reihenfolge überhaupt)? Es scheint nur ein eingebautes '' zu sein. –
Ja, es ist mehr oder weniger das eingebaute Diktat. Die Reihenfolge der Elemente im Diktat entspricht nicht der Reihenfolge der Übereinstimmungen. –