6 Stimmen

Python-Regex, was ist hier los?

Ich habe vor kurzem ein Buch über Python bekommen und darin gibt es ein Kapitel über Regex, in dem es einen Codeabschnitt gibt, den ich nicht wirklich verstehen kann. Kann jemand genau erklären, was hier los ist (dieser Abschnitt ist auf Regex-Gruppen)?

>>> my_regex = r'(?P<zip>Zip:\s*\d\d\d\d\d)\s*(State:\s*\w\w)'
>>> addrs = "Zip: 10010 State: NY"
>>> y = re.search(my_regex, addrs)
>>> y.groupdict('zip')
{'zip': 'Zip: 10010'}
>>> y.group(2)
'State: NY'

8voto

SchaeferFFM Punkte 318

Regex-Definition:

(?P<zip>...)

Erzeugt eine benannte Gruppe "zip".

Zip:\s*

Übereinstimmung mit "Zip:" und null oder mehr Leerzeichen

\d

Eine Ziffer zuordnen

\w

Übereinstimmung mit einem Wortzeichen [A-Za-z0-9_]

y.groupdict('zip')

Die Methode groupdict gibt ein Wörterbuch mit benannten Gruppen als Schlüssel und deren Übereinstimmungen als Werte zurück. In diesem Fall wird die Übereinstimmung für die Gruppe "zip" zurückgegeben

y.group(2)

Gibt die Übereinstimmung für die zweite Gruppe zurück, die eine unbenannte Gruppe "(...)" ist.

Ich hoffe, das hilft.

2voto

tristan Punkte 513

Les Suche Methode gibt ein Objekt zurück, das die Ergebnisse Ihres Regex-Musters enthält.

groupdict gibt ein Wörterbuch von Gruppen zurück, wobei die Schlüssel die Namen der durch (?P...) definierten Gruppen sind. Hier Name ist ein Name für die Gruppe.

Gruppe gibt eine Liste von Gruppen zurück, die übereinstimmen. "Staat: NY" ist Ihre dritte Gruppe. Die erste ist die gesamte Zeichenfolge und die zweite ist "Zip: 10010".

Dies war übrigens eine relativ einfache Frage. Ich habe einfach die Dokumentation der Methode bei Google nachgeschlagen und Folgendes gefunden diese Seite . Google ist Ihr Freund.

1voto

Teifion Punkte 102863
# my_regex = r' <= this means that the string is a raw string, normally you'd need to use double backslashes
# ( ... ) this groups something
# ? this means that the previous bit was optional, why it's just after a group bracket I know not
# * this means "as many of as you can find"
# \s is whitespace
# \d is a digit, also works with [0-9]
# \w is an alphanumeric character
my_regex = r'(?P<zip>Zip:\s*\d\d\d\d\d)\s*(State:\s*\w\w)'
addrs = "Zip: 10010 State: NY"

# Runs the grep on the string
y = re.search(my_regex, addrs)

0voto

Tim Pietzcker Punkte 311448

Les (?P<identifier>match) Syntax ist Pythons Art, benannte Erfassungsgruppen zu implementieren. Auf diese Weise können Sie auf das zugreifen, was durch match einen Namen anstelle einer fortlaufenden Nummer zu verwenden.

Da der erste Satz von Klammern den Namen zip können Sie auf die Übereinstimmung zugreifen, indem Sie die groupdict Methode zum Erhalten einer {identifier: match} Paar. Oder Sie könnten verwenden y.group('zip') wenn Sie nur an der Übereinstimmung interessiert sind (was normalerweise sinnvoll ist, da Sie die Kennung bereits kennen). Sie könnten auch über die fortlaufende Nummer (1) auf die gleiche Übereinstimmung zugreifen. Die nächste Übereinstimmung ist unbenannt, so dass die einzige Möglichkeit, auf sie zuzugreifen, ihre Nummer ist.

0voto

Federico A. Ramponi Punkte 44697

Ergänzend zu früheren Antworten: Meiner Meinung nach sollten Sie sich für eine Art von Gruppen (benannt oder unbenannt) entscheiden und dabei bleiben. Normalerweise verwende ich benannte Gruppen. Zum Beispiel:

>>> my_regex = r'(?P<zip>Zip:\s*\d\d\d\d\d)\s*(?P<state>State:\s*\w\w)'
>>> addrs = "Zip: 10010 State: NY"
>>> y = re.search(my_regex, addrs)
>>> print y.groupdict()
{'state': 'State: NY', 'zip': 'Zip: 10010'}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X