正则表达式在日期分裂并保持它

时间:2016-12-19 10:09:41

标签: regex python-2.7 date split

我想在日期分割一个字符串:

28/11/2016 Mushroom 05/12/2016 Carrot 12/12/2016 Broccoli 19/12/2016 Potato

最终应该是

 28/11/2016 Mushroom
 05/12/2016 Carrot
 12/12/2016 Broccoli
 19/12/2016 Potato

显然,日期的变化使其变得困难。我已经制定了正则表达式,但我也无法弄清楚如何保留分隔符(日期)。

import re

s = "28/11/2016 Mushroom 05/12/2016 Carrot 12/12/2016 Broccoli 19/12/2016 Potato"

replaced = re.sub(r"\d{2}\/\d{2}\/\d{4}\s*", ",", s) # looses data
print replaced

g = re.match(r"(\d{2}\/\d{2}\/\d{4}\s*)(.*)", s)

if g:
  # replaced = s.replace(group(0), "\n" + g.group(0)) # fails
  # print replaced 

1 个答案:

答案 0 :(得分:1)

如果日期之间总是有空格,则可以使用拆分方法:

\s+(?=\d+/\d+/\d+\s)

请参阅regex demo

<强>详情:

  • \s+ - 匹配1 +空格
  • (?=\d+/\d+/\d+\s) - 后跟1位数字,/ +一位或多位数两次(类似日期的模式),然后是空白

请参阅下面的Python demo

import re
rx = r"\s+(?=\d+/\d+/\d+\s)"
s = "28/11/2016 Mushroom 05/12/2016 Carrot 12/12/2016 Broccoli 19/12/2016 Potato"
results = re.split(rx, s)
print(results)

或者,可以使用更复杂的正则表达式来实际匹配这些日期:

\b\d+/\d+/\d+.*?(?=\s*\b\d+/\d+/\d+|$)

请参阅regex demoPython demo

import re
rx = r"\b\d+/\d+/\d+.*?(?=\b\d+/\d+/\d+|$)"
s = "28/11/2016 Mushroom 05/12/2016 Carrot 12/12/2016 Broccoli 19/12/2016 Potato"
results = re.findall(rx, s)
print(results)

在这里,

  • \b\d+/\d+/\d+ - 匹配单词边界和类似日期的模式
  • .*? - 任意0个字符,尽可能少到第一个位置后跟... ...
  • (?=\s*\b\d+/\d+/\d+|$) - 0+空格和类似日期的模式或字符串结尾($)。