Ich habe str1 und str2 unten, und ich möchte nur eine Regexp verwenden, die beide übereinstimmen. Im Falle von str1, möchte ich auch die Anzahl der QSFP-Ports in der Lage sein zu erfassenWie zeichne Strings mit * oder? mit Gruppen in Python reguläre Ausdrücke
>>> str1='''4 48 48-port and 6 QSFP 10GigE Linecard 7548S-LC'''
>>> str2='''4 48 48-port 10GigE Linecard 7548S-LC'''
>>>
Ich möchte die Zahlen „4“ in der Lage sein zu erfassen, „48“, „6“ (falls vorhanden), und "7548". Aber ich kann "6" nicht mit dem "?" Metazeichen.
Wenn ich keinen metacharacter verwenden, funktioniert die Erfassung für str1, aber dann kann ich diese Regex verwenden, weil es wird nicht für str2 arbeiten:
>>> re.search(r'^(\d+)\s+(\d+)\s+.*(?:(\d+)\s+QSFP).*\s+(\d+)S-LC', str1, re.I|re.M).group(3)
'6'
>>>
Es funktioniert sogar, wenn ich die „+“ verwenden, um ein Auftreten zeigen, aber auch hier diese nicht funktioniert für str2:
>>> re.search(r'^(\d+)\s+(\d+)\s+.*(?:(\d+)\s+QSFP)+.*\s+(\d+)S-LC', str1, re.I|re.M).group(3)
'6'
>>>
Wenn ich „?“ um für 0 oder 1 Vorkommen zu entsprechen, schlägt die Aufnahme sogar für str1 fehl:
>>> re.search(r'^(\d+)\s+(\d+)\s+.*(?:(\d+)\s+QSFP)?.*\s+(\d+)S-LC', str1, re.I|re.M).group(3)
>>>
Die Kombination von Quantifikatoren ist sinnlos ("0 oder mehr Kopien von 1 oder mehr Kopien von' \ d' "). Was versuchst du wirklich? – geekosaur
Ich denke 're.search (r '(\ d +)', str1) .group (0)' ist ausreichend. – RanRag
Ich möchte den Dezimalwert erfassen, wenn es in 'str1' erscheint, aber ich möchte nicht die Regex fehlschlagen, wenn es keinen Dezimalwert gibt. Also was ich wirklich will ist, dass dies unten den Dezimalwert erfasst: re.search (r '(\ d +)?', Str1) .group (1) –