Python正则表达式拆分字符串求助:适配两种格式的可行方案
适配两种字符串的正则拆分方案
问题场景
现有两个待处理字符串:
'''N678 N−12.,13.12.22,18.,19.,31.1.,9.2.,7. au 10.,13. au 17.,20.,21.,22.,28. au 31.3.,6.,13.,19.,20.4.,5.,8.5.23''' '''N678 à p. du 11.6.23 C+23.6.23 N−14.,24.7.23'''
要求对第二个字符串拆分后得到:
['N678 à p. du 11.6.23 ', 'C+23.6.23 ', 'N−14.,24.7.23']
拆分规则:当文本中出现 任意字符\s\d{1,2}.\d{1,2}.\d{2,4}\s[A-Z] 格式时,在此处拆分。
之前的正则尝试存在兼容性问题:
- 使用
([A-Za-z].*?\d{1,2}\.\d{1,2}\.\d{2,4}\s*)时,第二个字符串拆分正常,但第一个字符串会错误截断,得到:['N678 N−12.,13.12.22', 'au 10.,13. au 17.,20.,21.,22.,28.\nau 31.3.,6.,13.,19.,20.4.,5.,8.5.23'] - 去掉非贪婪匹配的问号后,第一个字符串拆分正常,但第二个字符串无法正确拆分。
可行正则方案
使用带正向预查的正则表达式,同时兼容两种字符串:
r'(.*?\d{1,2}\.\d{1,2}\.\d{2,4}\s*)(?=[A-Z]|$)'
正则逻辑说明
.*?:非贪婪匹配任意字符,防止过度匹配导致的错误截断\d{1,2}\.\d{1,2}\.\d{2,4}:精准匹配日.月.年格式的日期(年支持2位或4位)\s*:匹配日期后的零个或多个空白字符(?=[A-Z]|$):正向预查,确保当前匹配段的后续内容是大写字母(触发拆分的条件)或字符串结尾(捕获最后一段内容)
效果验证
处理第二个字符串:
拆分结果完全符合预期:['N678 à p. du 11.6.23 ', 'C+23.6.23 ', 'N−14.,24.7.23']处理第一个字符串:
拆分结果正确,每个包含日期的段落都被独立拆分:['N678 N−12.,13.12.22,18.,19.,31.1.,9.2.,7. ', 'au 10.,13. ', 'au 17.,20.,21.,22.,28.\n', 'au 31.3.,6.,13.,19.,20.4.,5.,8.5.23']
内容的提问来源于stack exchange,提问作者Ferroum Samir
相关产品推荐
相关产品推荐

