将正则表达式与可选的先行匹配
match a regular expression with optional lookahead
我有以下字符串:
NAME John Nash FROM California
NAME John Nash
我想要一个能够为两个字符串提取 'John Nash' 的正则表达式。
这是我试过的
"NAME(.*)(?:FROM)"
"NAME(.*)(?:FROM)?"
"NAME(.*?)(?:FROM)?"
但是 none 这些对两个字符串都有效。
您可以在 FROM
和锚点 $
之间使用逻辑或:
NAME(.*)(?:FROM|$)
观看演示 https://regex101.com/r/rR3gA0/1
在这种情况下,在名称之后它将匹配正则表达式中的 FROM
或 string.But 的末尾,因为在第一种情况下您将 FROM
设为可选,它将匹配其余部分名称后的字符串。
如果你想使用更通用的正则表达式,你最好根据你的名字可能形状创建你的正则表达式,例如,如果你确定你的名字是由 2 个单词创建的,你可以使用以下正则表达式:
NAME\s(\w+\s\w+)
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
使字符串的第二部分可选 (?: FROM.*?)?
,即:
NAME (.*?)(?: FROM.*?)?$
MATCH 1
1. [5-14] `John Nash`
MATCH 2
1. [37-46] `John Nash`
MATCH 3
1. [53-66] `John Doe Nash`
正则表达式演示
https://regex101.com/r/bL7kI2/2
你可以不用正则表达式:
>>> myStr = "NAME John Nash FROM California"
>>> myStr.split("FROM")[0].replace("NAME","").strip()
'John Nash'
我有以下字符串:
NAME John Nash FROM California
NAME John Nash
我想要一个能够为两个字符串提取 'John Nash' 的正则表达式。
这是我试过的
"NAME(.*)(?:FROM)"
"NAME(.*)(?:FROM)?"
"NAME(.*?)(?:FROM)?"
但是 none 这些对两个字符串都有效。
您可以在 FROM
和锚点 $
之间使用逻辑或:
NAME(.*)(?:FROM|$)
观看演示 https://regex101.com/r/rR3gA0/1
在这种情况下,在名称之后它将匹配正则表达式中的 FROM
或 string.But 的末尾,因为在第一种情况下您将 FROM
设为可选,它将匹配其余部分名称后的字符串。
如果你想使用更通用的正则表达式,你最好根据你的名字可能形状创建你的正则表达式,例如,如果你确定你的名字是由 2 个单词创建的,你可以使用以下正则表达式:
NAME\s(\w+\s\w+)
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
使字符串的第二部分可选 (?: FROM.*?)?
,即:
NAME (.*?)(?: FROM.*?)?$
MATCH 1
1. [5-14] `John Nash`
MATCH 2
1. [37-46] `John Nash`
MATCH 3
1. [53-66] `John Doe Nash`
正则表达式演示
https://regex101.com/r/bL7kI2/2
你可以不用正则表达式:
>>> myStr = "NAME John Nash FROM California"
>>> myStr.split("FROM")[0].replace("NAME","").strip()
'John Nash'