2016-07-27 7 views
0
(1[0-9]{2})\s+(\w+(?:-\w+)+)\s+(\w+)\s+(\w+(?:-\w+)+)\s+(\w+) 

verwendet String zupython regex Nicht-Capture-Gruppe Umgang

123 FEX-1-80 Online N2K-C2248TP-1GE SSDFDFWFw23r23 

Wie kommt das funktioniert in regexr.com aber Python 3.5.1 keine Übereinstimmung

r'(1[0-9]{2})\s+(\w+(?:-\w+)+)\s+(\w+)\s+(\w+(?:-\w+))' 

finden kann bis zu

123 FEX-1-80 Online N2K-C2248TP 

aber die zweite Bindestrich-Gruppe (4) entspricht nicht

Von was ich verstehe, kann Nicht-Capture-Gruppe Charakter mehr als einmal in der Gruppe erscheinen, was ist hier schiefgelaufen?

Antwort

0

Dieser reguläre Ausdruck paßt das volle Eingabestring:

(1[0-9]{2})\s+(\w+(?:-\w+)+)\s+(\w+)\s+(\w+(?:-\w+)+)\s+(\w+) 

Dies nicht:

(1[0-9]{2})\s+(\w+(?:-\w+)+)\s+(\w+)\s+(\w+(?:-\w+)) 

Letzteres ist ein + nach der letzten Nicht-Erfassung Gruppe fehlt, und es fehlt die \s+(\w+) am Ende, das die SSDFDFWFw23r23 am Ende der Eingabezeichenfolge entspricht.

Von was ich verstehe, kann non-Capture-Gruppe Charakter mehr als einmal in der Gruppe erscheinen, was ist hier schief gelaufen?

Ich bin mir nicht sicher, ob ich folge. Eine nicht erfassende Gruppe ist wirklich nur dazu da, einen Teil eines regulären Ausdrucks zu gruppieren.

(?:-\w+) oder nur -\w+ sowohl einen Bindestrich (-) durch ein oder mehrere „Wort“ Zeichen (\w+), gefolgt entsprechen. Es spielt keine Rolle, ob dieser reguläre Ausdruck in einer nicht einfangenden Gruppe ist oder nicht. Wenn Sie Wiederholungen dieses Musters anpassen möchten, können Sie den Modifikator + nach der nicht erfassenden Gruppe verwenden, z. (?:-\w+)+. Dieses Muster entspricht einer Zeichenfolge wie -foo-bar-baz.

Der Grund, warum Ihr zweiter regulärer Ausdruck nicht mit dem wiederholten Muster übereinstimmt, ist, dass der Modifizierer + fehlt.

0

Nur ein Kommentar, nicht wirklich eine Antwort, aber aus Gründen der Klarheit habe ich es als eine Antwort formuliert.
Als relativ neu zu regulären Ausdrücken sollte man den ausführlichen Modus verwenden. Damit wird Ihr Ausdruck viel viel besser lesbar:

(1[0-9]{2})\s+  # three digits, the first one needs to be 1 
(\w+(?:-\w+)+)\s+ # a word character (wc), followed by - and wcs 
(\w+)\s+   # another word 
(\w+(?:-\w+)+)\s+ # same expression as above 
(\w+)    # another word 

überprüfen Sie auch, ob Ihr (zweite und vierte) Ausdruck als [\w-]+ neu geschrieben werden könnte - es ist nicht das gleiche wie Sie und wird anderen Teil passen, aber versuchen, vermeiden Sie verschachtelte Klammern im Allgemeinen.

In Bezug auf Ihre Frage, die zweite Zeichenfolge kann nicht übereinstimmen, da Sie alle Ihre Ausdrücke obligatorisch gemacht (und Gruppe 5 fehlt im zweiten Beispiel, so wird es fehlschlagen).

Siehe a demo on regex101.com.

+0

Danke für den Link, noch leistungsfähiger als regexr.com. '[\ w -] +' kann wahrscheinlich meine Bedürfnisse befriedigen, wie unterscheidet es sich von \ w + (?: - \ w +) + ' – sdaffa23fdsf

+0

Es ist ziemlich anders: [** zuerst **] (https: // regex101 .com/r/bX5eR1/3) und [** zweite **] (https://regex101.com/r/bX5eR1/4) – Jan