将正则表达式与可选的前瞻匹配

时间:2015-10-12 22:05:48

标签: python regex regex-lookarounds regex-greedy

我有以下字符串:

NAME John Nash FROM California

NAME John Nash

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

这是我试过的

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

但这两个字符串都不起作用。

4 个答案:

答案 0 :(得分:5)

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

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

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

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

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

NAME\s(\w+\s\w+)

演示https://regex101.com/r/kV2eB9/2

答案 1 :(得分: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`

正则表达式演示
https://regex101.com/r/bL7kI2/2

答案 2 :(得分:1)

你可以不用正则表达式:

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

答案 3 :(得分: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