2015-10-12 18 views
5

ich folgende Saiten entsprechen:einen regulären Ausdruck mit optionaler Look-Ahead-

NAME John Nash FROM California

NAME John Nash

ich einen regulären Ausdruck für beide Strings zu extrahieren 'John Nash' fähig wollen.

Hier ist, was ich versucht

"NAME(.*)(?:FROM)" 
"NAME(.*)(?:FROM)?" 
"NAME(.*?)(?:FROM)?" 

aber keines dieser Werke für beide Saiten.

+0

Sind diejenigen, sowohl eine volle Linie? –

Antwort

4

können Sie logische verwenden ODER zwischen FROM und Anker $:

NAME(.*)(?:FROM|$) 

Siehe Demo https://regex101.com/r/rR3gA0/1

In diesem Fall nach dem Namen wird es FROM oder das Ende des string.But in Ihrer Regex Da Sie die FROM optional in ersten Fall machen, wird es den Rest der Zeichenfolge nach dem Namen übereinstimmen.

Wenn Sie eine allgemeinere regex verwenden Sie besser Ihre Regex zu erstellen, basierend auf Ihren Namen Möglichkeit Formen zum Beispiel, wenn Sie sicher sind, dass Ihre Namen von 2 Wörtern erstellen, werden Sie folgenden regulären Ausdruck verwenden:

NAME\s(\w+\s\w+) 
Demo

https://regex101.com/r/kV2eB9/2

0
r'^\w+\s+(\w+\s+\w+) - word at start of string 
follows by one or more spaces and 
two words and at least one space between them 

with open('data', 'r') as f: 
    for line in f: 
     mo = re.search(r'^\w+\s+(\w+\s+\w+)',line) 
     if mo: 
     print(mo.group(1)) 

John Nash 
John Nash 
2

Machen Sie den zweiten Teil des Strings optional (?: FROM.*?)?, das heißt:


MATCH 1 
1. [5-14] `John Nash` 
MATCH 2 
1. [37-46] `John Nash` 
MATCH 3 
1. [53-66] `John Doe Nash` 

Regex Demo
https://regex101.com/r/bL7kI2/2

1

Sie ohne regex tun können:

>>> myStr = "NAME John Nash FROM California" 
>>> myStr.split("FROM")[0].replace("NAME","").strip() 
'John Nash' 
Verwandte Themen