以下字符串的正则表达式模式?

时间:2017-08-21 20:55:44

标签: python regex

以下字符串的正则表达式模式是什么:

hi firstName lastName 27 Jun 2017

字符串中应标识3个字段:优先级,名称和日期。到目前为止,我有以下正则表达式:

^(\w+)\s+(.*?)\s+

它标识优先级,但不标识全名。我的正则表达式标识 firstName ,不包括 lastName

提前致谢!

2 个答案:

答案 0 :(得分:3)

您的正则表达式不会提取全名,因为\s+(.*?)\s+部分匹配1个或更多空格,然后匹配并捕获除了换行符之外的任何0 +字符,尽可能少到前1个空格。这些空格是在firstName之后找到的,因为没有更多的必要原子可以匹配。

您可以使用

^(?P<priority>\w+)\s+(?P<name>.*?)\s+(?P<date>\d.*)

请参阅regex demo

<强>详情

  • ^ - 字符串的开头(如果使用re.match则隐式)
  • (?P<priority>\w+) - 群组“优先级”:1 + word chars
  • \s+ - 一个或多个空格
  • (?P<name>.*?) - 组“名称”:除了换行符之外的任何0 +字符尽可能少
  • \s+ - 一个或多个空格
  • (?P<date>\d.*) - 组“日期”:数字,然后是其余部分。

Python demo

import re
rx = r"(?P<priority>\w+)\s+(?P<name>.*?)\s+(?P<date>\d.*)"
s = "hi firstName lastName 27 Jun 2017"
m = re.match(rx, s)
if m:
    print(m.group("priority")) # => hi
    print(m.group("name"))     # => firstName lastName
    print(m.group("date"))     # => 27 Jun 2017

答案 1 :(得分:0)

您可以使用re.findall()

import re
s = "hello John Someone 27 June 2017"
name = re.findall("\w+[a-zA-Z]+", s)[1:-1]
priority = re.findall("^\w+", s)[0]
date = re.findall("\d+\s\w+\s\d+", s)[0]
print(name)
print(priority)
print(date)

输出:

['John', 'Someone']
'hello'
'27 June 2017'