如何用Python 3.10格式化含多余空格的日期字符串?
解决方法
首先你原来的正则没法精准捕获日期的各组成部分,得换成分组式的正则来匹配混乱结构,再通过替换函数清理空格。
步骤1:编写匹配混乱日期的正则
我们需要匹配的日期结构是:数字(含空格) + .(前后可能有空格) + 月份字母(含空格) + 年份数字(含空格),对应的正则如下:
pattern = r'(\d(?:\s+\d)*)\s*\.\s*([A-Z](?:\s+[A-Z])*)\s*(\d(?:\s+\d){3})'
各分组说明:
- 第一个分组
(\d(?:\s+\d)*):匹配日的数字(比如"1"、"1 8"这类带空格的数字) \s*\.\s*:匹配点号以及前后的任意空格- 第二个分组
([A-Z](?:\s+[A-Z])*):匹配月份的字母(比如"J U L Y"、"D E C E M B E R") - 第三个分组
(\d(?:\s+\d){3}):匹配四位年份的数字(比如"1 9 5 0"、"2 0 1 8")
步骤2:写替换函数清理空格
定义一个函数,接收正则匹配对象,对每个分组去掉空格后重新拼接成正确格式:
def fix_date_match(match): # 清理日的空格,加上点号 day = match.group(1).replace(" ", "") + "." # 清理月份的空格 month = match.group(2).replace(" ", "") # 清理年份的空格 year = match.group(3).replace(" ", "") # 拼接成目标格式:"日. 月份 年份" return f"{day} {month} {year}"
步骤3:批量处理字符串
用re.sub批量替换每个字符串里的混乱日期,完整示例代码:
import re # 正则模式和替换函数 pattern = r'(\d(?:\s+\d)*)\s*\.\s*([A-Z](?:\s+[A-Z])*)\s*(\d(?:\s+\d){3})' def fix_date_match(match): day = match.group(1).replace(" ", "") + "." month = match.group(2).replace(" ", "") year = match.group(3).replace(" ", "") return f"{day} {month} {year}" # 测试示例字符串 test_strings = [ "\"1 . J U L Y 1 9 5 0\"", "\"1 8 . A P R I L 1 9 8 0\"", "\"Hello world, today is: 2 4 . J A N U A R Y 2 0 0 0\"", "\"D E C I S I O N: 1 3 . D E C E M B E R 2 0 1 8 / P U B L I S H E D: 1 4 . D E C E M B E R 2 0 1 8\" (edit)" ] for s in test_strings: fixed_str = re.sub(pattern, fix_date_match, s) print(fixed_str)
运行后输出就是你需要的正确格式:
- "1. JULY 1950"
- "18. APRIL 1980"
- "Hello world, today is: 24. JANUARY 2000"
- "D E C I S I O N: 13. DECEMBER 2018 / P U B L I S H E D: 14. DECEMBER 2018" (edit)
关于你原来的正则
你原来的^\s*\d+\s+[\S\s]*\s+\d{1}\s*\d{1}\s*\d{1}\s*\d{1}\s*$是匹配整个字符串的,而且无法提取日期的日、月、年细分部分,没法针对性清理空格,所以换成分组捕获的正则更适配需求。
内容的提问来源于stack exchange,提问作者quadratecode
相关产品推荐
相关产品推荐

