给定这个字符串:
s = '01/03/1988 U/9 Mi\n08/19/1966 ABC\nDEF\n12/31/1999 YTD ABC'
我想将它拆分为每个新记录(以日期开头),如下所示:
['01/03/1988 U/9 Mi', '08/19/1966 ABC\nDEF', '12/31/1999 YTD ABC']
注意到 ABC 和 DEF 之间额外的新行分隔符了吗?这就是我面临的挑战。我想在那里不分裂地保存它。 我想我需要有条件地拆分这些分隔符:
['01/', '02/','03/', '04/', '05/', '06/', '07/', '08/', '09/', '10/', '11/', '12/']
有没有一种简单的方法可以这样使用 re.findall
或者有更好的方法吗?
提前致谢!
答案 0 :(得分:2)
您可以在后跟日期的新行上拆分,并带有前瞻。类似的东西:
import re
s = '01/03/1988 U/9 Mi\n08/19/1966 ABC\nDEF\n12/31/1999 YTD ABC'
re.split(r'\n(?=\d{2}/\d{2}/\d{4})', s)
# ['01/03/1988 U/9 Mi', '08/19/1966 ABC\nDEF', '12/31/1999 YTD ABC']
根据您的数据,您可以简化为仅一个换行符后跟 2 位数字:r'\n(?=\d{2})'
答案 1 :(得分:1)
改用正则表达式。
import re
s = '01/03/1988 U/9 Mi\n08/19/1966 ABC\nDEF\n12/31/1999 YTD ABC'
chunks = re.compile(r'[\n](?=\d\d/\d\d/\d\d\d\d)').split(s)
print(chunks)
['01/03/1988 U/9 Mi', '08/19/1966 ABC\nDEF', '12/31/1999 YTD ABC']
答案 2 :(得分:1)
您还可以匹配更具体的日期,例如无需环顾的格式。
^(?:0[1-9]|1[012])/(?:0[1-9]|[12]\d|3[01])/(?:19|20)\d\d\b.*$
^
字符串开头(?:0[1-9]|1[012])
匹配一个从 01 到 12 的月份/
逐字匹配(?:0[1-9]|[12]\d|3[01])
匹配一个数字 01 - 31/
逐字匹配(?:19|20)\d\d
匹配 19 或 20 和 2 位数字(或仅 4 位数字 \d{4}
)\b.*
一个词边界并匹配该行的其余部分$
字符串结束示例代码
import re
s = '01/03/1988 U/9 Mi\n08/19/1966 ABC\nDEF\n12/31/1999 YTD ABC'
regex = r'^(?:0[1-9]|1[012])/(?:0[1-9]|[12]\d|3[01])/(?:19|20)\d\d\b.*$'
print(re.findall(regex, s, re.MULTILINE))
输出
['01/03/1988 U/9 Mi', '08/19/1966 ABC', '12/31/1999 YTD ABC']