匹配具有可选前瞻性的正则表达式



我有以下字符串:

NAME John Nash FROM California

NAME John Nash

我想要一个能够为两个字符串提取'John Nash'的正则表达式。

这是我尝试过的

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

可以在FROM和锚$之间使用逻辑或:

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

参见演示https://regex101.com/r/rR3gA0/1

在这种情况下,在名称之后,它将匹配FROM或字符串的末尾。但是在你的正则表达式中,因为你使FROM在第一种情况下是可选的,它将匹配名称后的字符串的其余部分。

如果你想使用更通用的正则表达式,你最好根据你的名字的可能性形状来创建你的正则表达式,例如,如果你确定你的名字是由2个单词创建的,你可以使用以下正则表达式:

NAMEs(w+sw+)
演示https://regex101.com/r/kV2eB9/2

将字符串的第二部分设置为可选的(?: 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`


Regex演示https://regex101.com/r/bL7kI2/2

 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

你可以不使用regex:

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

最新更新