2015-10-12 15 views
5

Tôi có chuỗi kí tự sau:phù hợp với một biểu thức chính quy với tùy chọn lookahead

NAME John Nash FROM California

NAME John Nash

Tôi muốn có một biểu hiện thường xuyên có khả năng trích xuất 'John Nash' cho cả chuỗi.

Đây là những gì tôi đã cố gắng

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

nhưng không ai trong số những tác phẩm cho cả chuỗi.

+0

Là những cả một dòng đầy đủ? –

Trả lời

4

Bạn có thể sử dụng logic OR giữa FROM và neo $:

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

Xem bản demo https://regex101.com/r/rR3gA0/1

Trong trường hợp này sau khi tên nó sẽ phù hợp FROM hoặc cuối string.But trong regex của bạn kể từ khi bạn thực hiện các tùy chọn FROM trong trường hợp linh sam nó sẽ phù hợp với phần còn lại của chuỗi sau tên.

Nếu bạn muốn sử dụng một regex tổng quát hơn bạn tốt hơn để tạo regex của bạn dựa trên hình dạng tên khả năng của bạn ví dụ nếu bạn chắc chắn rằng tên của bạn được tạo ra từ 2 từ mà bạn có thể sử dụng sau regex:

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

làm cho phần thứ hai của chuỗi tùy chọn (?: FROM.*?)?, ví dụ:

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

Bạn có thể làm mà không regex:

>>> myStr = "NAME John Nash FROM California" 
>>> myStr.split("FROM")[0].replace("NAME","").strip() 
'John Nash' 
Các vấn đề liên quan