Python 条件拆分

时间:2020-12-30 00:44:33

标签: python split

给定这个字符串:

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 或者有更好的方法吗?

提前致谢!

3 个答案:

答案 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.* 一个词边界并匹配该行的其余部分
  • $ 字符串结束

Regex demo | Python demo

示例代码

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']
相关问题