如何在Python中使用正则表达式高效分割含日期结构的列表
高效处理日期分隔的列表,生成按天分组的嵌套列表
我明白你现在的困扰——把这种日期作为分隔符的列表转换成按天分组的嵌套列表,用合并字符串再分割的方法确实会把事情复杂化,还容易丢失关键的日期信息。其实我们可以换个更直接高效的思路,直接遍历原列表进行分组,不需要把所有内容拼在一起处理。
核心思路
- 先写一个辅助函数,用来判断列表中的元素是不是符合格式的日期;
- 遍历原列表,遇到日期就新建一个子列表,把日期放进去;遇到非日期内容,就把它加入当前的子列表;
- 遍历结束后,把最后一个子列表也加入结果中。
具体实现代码
import re def is_date(item): # 匹配「星期几, 月份 日期, 年份」的格式 date_pattern = r'^[A-Za-z]+, [A-Za-z]+ \d{1,2}, \d{4}$' return re.fullmatch(date_pattern, item) is not None input_list = [ 'Wednesday, March 16, 2022', 'bla-bla-bla', 'Hello World !', 'Friday, April 8, 2022', "Can't wait for the weekend", 'See you !' ] result = [] current_group = [] for item in input_list: if is_date(item): # 如果当前已有分组,先把它加入结果 if current_group: result.append(current_group) # 新建分组,把日期作为第一个元素 current_group = [item] else: # 非日期内容加入当前分组 current_group.append(item) # 别忘了把最后一个分组加入结果 if current_group: result.append(current_group) print(result)
代码说明
is_date函数用re.fullmatch确保整个元素都符合日期格式,避免误判内容里的类似片段;- 遍历过程中我们始终维护
current_group,用来装当前日期对应的所有内容,遇到新日期就把之前的分组存起来,新建分组; - 最后一定要处理循环结束后剩下的
current_group,不然最后一天的内容会丢失。
运行这段代码后,你会得到期望的嵌套列表:
[ ['Wednesday, March 16, 2022', 'bla-bla-bla', 'Hello World !'], ['Friday, April 8, 2022', "Can't wait for the weekend", 'See you !'] ]
为什么不推荐合并字符串分割?
你之前尝试的合并后split的方法,最大问题是分割后会丢失日期本身,而且如果内容里有类似日期的字符片段,还会导致错误分割。直接遍历的方法不仅效率更高(不需要拼接大字符串),逻辑也更清晰,后续要调整分组规则(比如把日期放在子列表最后)也非常容易——只需要把current_group = [item]改成current_group = [],然后后续在分组结束时再把日期加进去就行。
内容的提问来源于stack exchange,提问作者Strauss Alexandre
相关产品推荐
相关产品推荐

