2015-10-12 15 views
5

ho le seguenti stringhe:corrispondono a un'espressione regolare con lookahead opzionale

NAME John Nash FROM California

NAME John Nash

Voglio un'espressione regolare in grado di estrarre 'John Nash' per entrambe le stringhe.

Ecco quello che ho provato

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

ma nessuno di questi lavori per entrambe le stringhe.

+0

Sono quelli sia una linea completa? –

risposta

4

È possibile utilizzare logica OR tra FROM e di ancoraggio $:

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

See demo https://regex101.com/r/rR3gA0/1

In questo caso dopo il nome abbinerà FROM o la fine del string.But nella vostra regex dal momento che si rende lo FROM facoltativo in caso di emergenza, corrisponderà al resto della stringa dopo il nome.

Se si desidera utilizzare una regex più generale è meglio per creare la tua regex, sulla base di forme nome possibilità, ad esempio, se si è certi che i vostri nomi sono creare da 2 parole è possibile utilizzare seguente espressione regolare:

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

fare la seconda parte della stringa opzionale (?: FROM.*?)?, vale a dire:

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

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

Si può fare a meno di espressione regolare:

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