我想在日期分割一个字符串:
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
答案 0 :(得分:1)
如果日期之间总是有空格,则可以使用拆分方法:
\s+(?=\d+/\d+/\d+\s)
请参阅regex demo
<强>详情:
\s+
- 匹配1 +空格(?=\d+/\d+/\d+\s)
- 后跟1位数字,/
+一位或多位数两次(类似日期的模式),然后是空白{ LI>
请参阅下面的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+|$)
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+空格和类似日期的模式或字符串结尾($
)。