正则表达式 - 将字符串值和日期匹配在一起

时间:2017-04-08 07:14:21

标签: python regex regex-lookarounds

我有一个看起来像以下的字符串,我应该提取密钥:值,我正在使用正则表达式。

line ="Date : 20/20/20  Date1 : 15/15/15  Name : Hello World   Day : Month  Weekday : Monday" 


1) Extracting the key or attributes only.

   re.findall(r'\w+\s?(?=:)',line)
   #['Date ', 'Date1 ', 'Name ', 'Day ', 'Weekday ']

2)Extracting the dates only

   re.findall(r'(?<=:)\s?\d{2}/\d{2}/\d{2}',line)
   #[' 20/20/20', ' 15/15/15']

3)Extracting the strings perfectly but also some wrong format dates.

   re.findall(r'(?<=:)\s?\w+\s?\w+',line)
   # [' 20', ' 15', ' Hello World', ' Month', ' Monday']

但是当我尝试使用OR运算符拉出字符串和日期时,输出错误。我相信管道没有正常工作。

re.findall(r'(?<=:)\s?\w+\s?\w+|\s?\d{2}/\d{2}/\d{2}',line)
# [' 20', ' 15', ' Hello World', ' Month', ' Monday']

上述命令提取日期(dd / mm / yy)格式和字符串值的任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

你需要翻转它。

\s?\d{2}/\d{2}/\d{2}|(?<=:)\s?\w+\s?\w+

Live preview

Regex将首先尝试匹配第一部分。如果成功,它将不会尝试下一部分。然后中断的原因是因为\w导致匹配日期的第一个数字。由于/不是\w(单词字符),因此会在此时停止。

翻转它会使它首先尝试匹配日期。如果它不匹配,则尝试匹配属性。从而避免了这个问题。