2015-10-12 16 views
5

Mam następujące ciągi:pasuje do wyrażenia regularnego z opcjonalnym uprzedzona

NAME John Nash FROM California

NAME John Nash

Chcę wyrażenia regularnego w stanie wyciągnąć „John Nash” dla obu łańcuchów.

Oto, co starałem

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

ale żadna z tych prac dla obu łańcuchów.

+0

Czy te oba pełną linię? –

Odpowiedz

4

Można użyć logiczny OR między FROM i kotwicy $:

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

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

W tym przypadku po nazwie będzie pasować FROM lub koniec string.But w swoim regex od kiedy opcja FROM jest opcjonalna w pierwszym przypadku, po nazwie będzie pasowała do pozostałej części łańcucha.

Jeśli chcesz użyć bardziej ogólnych regex lepiej stworzyć swój regex na podstawie swoich kształtów nazwa możliwość przykład, jeśli jesteś pewien, że wasze imiona są tworzyć od 2 słowa można użyć następującego wyrażenia regularnego:

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

Dodać drugą część napisu opcjonalnie (?: FROM.*?)?, a mianowicie:

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

Można to zrobić bez regex:

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