2017-12-09 2 views
0

Test-string:Regex: die Kombination von zwei Gruppen

First 
Name: 
MICKEY 
One to 
four lines 
of cruft go here 
Last 
Name: 
MOUSE 
More cruft 
goes here 

Ich möchte eine einzelne Gruppe "MICKEY MOUSE" zurückzukehren

ich habe:

(?:First\WName:)\W((.+)\W(?:((.+\W){1,4})(?:Last\WName:\W))(.+)) 

Gruppe 2 gibt MICKEY und Gruppe 5 gibt MOUSE zurück.

Ich dachte, dass sie in einer einzigen Gruppe und die mittleren Gruft und Nachnamen Segmente nicht einfangenden Gruppen mit ?: würde verhindern, dass sie erscheinen. Aber die Gruppe 1 zurück

MICKEY One to four lines of cruft go here Last Name: MOUSE

Wie kann ich es in der Mitte Sachen aus zu entfernen, was zurückgegeben wird (oder alternativ kombinieren Gruppen 2 und Gruppe 5 in eine einzige Namen oder nummerierte Gruppe)?

Antwort

0

können Sie die Zeichenfolge aufgeteilt und überprüfen, ob alle Zeichen sind Großbuchstaben:

import re 
s = """ 
First 
Name: 
MICKEY 
One to 
four lines 
of cruft go here 
Last 
Name: 
MOUSE 
More cruft 
goes here 
""" 
final_data = ' '.join(i for i in s.split('\n') if re.findall('^[A-Z]+$', i)) 

Ausgang:

'MICKEY MOUSE' 

Oder eine reine regex Lösung:

new_data = ' '.join(re.findall('(?<=)[A-Z]+(?=\n)', s)) 

Ausgang:

'MICKEY MOUSE' 
0

Mit re.search() Funktion und spezifische RegexMuster:

import re 

s = ''' 
First 
Name: 
MICKEY 
One to 
four lines 
of cruft go here 
Last 
Name: 
MOUSE 
More cruft 
goes here''' 

result = re.search(r'Name:\n(?P<firstname>\S+)[\s\S]*Name:\n(?P<lastname>\S+)', s).groupdict() 
print(result) 

Der Ausgang:

{'firstname': 'MICKEY', 'lastname': 'MOUSE'} 

----------

Oder noch einfacher mit re.findall() Funktion:

result = re.findall(r'(?<=Name:\n)(\S+)', s) 
print(result) 

Der Ausgang:

['MICKEY', 'MOUSE'] 
0

Um dies zu lösen, die Sie Verwendung von nicht Capturing Gruppen in regex machen könnten. Diese werden erklärt mit: (?:)

Nach dem Ändern der Regex:

(?:First\WName:)\W((.+)\W(?:(?:(?:.+\W){1,4})(?:Last\WName:\W))(.+)) 

Sie tun können, die folgende in Python:

import re 

inp = """ 
First 
Name: 
MICKEY 
One to 
four lines 
of cruft go here 
Last 
Name: 
MOUSE 
More cruft 
goes here 
""" 
query = r'(?:First\WName:)\W((.+)\W(?:(?:(?:.+\W){1,4})(?:Last\WName:\W))(.+))' 
output = ' '.join(re.match(query, inp).groups())