Python3.6.2正则表达式求助:按<xxx>格式分割分段数据失败
解决正则匹配分段字符串的问题
我明白你遇到的困扰了——想要把以<xxx>(三个字母字符开头)的长字符串拆分成独立分段,但尝试的正则要么匹配整个字符串,要么只能拿到分段标识加一个字符。下面给你两种可行的解决方案,顺便分析下之前尝试的问题出在哪。
方法一:使用正向预查的正则匹配
这是最直接的方式,通过正向预查告诉正则什么时候停止匹配:
import re target_str = '<AAA>q2w *dc<BBB>12sd<CCC>wer(4rf) q w ddcd<DDD> w erdfWED#2w' # 正则表达式:匹配<三个字母>开头,直到下一个<三个字母>或字符串结尾的内容 pattern = r'(<[A-Za-z]{3}>.*?)(?=<[A-Za-z]{3}>|$)' segments = re.findall(pattern, target_str) print(segments)
运行结果会是你预期的分段:
['<AAA>q2w *dc', '<BBB>12sd', '<CCC>wer(4rf) q w ddcd', '<DDD> w erdfWED#2w']
正则各部分解释:
<[A-Za-z]{3}>:精准匹配分段开头的标识,[A-Za-z]确保只匹配字母(避免\w包含下划线/数字的问题),{3}限制长度为3。.*?:非贪婪模式匹配任意字符(除换行),会尽可能少的匹配内容,直到满足后面的断言。(?=<[A-Za-z]{3}>|$):正向预查断言,告诉正则“当后面遇到下一个分段标识,或者字符串结尾时,就停止匹配”,这是解决你之前问题的核心。
方法二:先拆分再组合
如果对正向预查不太熟悉,也可以用re.split先拆分字符串,再重新组合成分段:
import re target_str = '<AAA>q2w *dc<BBB>12sd<CCC>wer(4rf) q w ddcd<DDD> w erdfWED#2w' # 按分段标识拆分,同时保留标识本身(括号的作用) split_parts = re.split(r'(<[A-Za-z]{3}>)', target_str) # 过滤空字符串,然后两两组合标识和内容 segments = [''.join(split_parts[i:i+2]) for i in range(1, len(split_parts), 2)] print(segments)
这个方法也能得到和上面完全一致的结果,逻辑更直观:先把字符串拆成['', '<AAA>', 'q2w *dc', '<BBB>', '12sd', ...],再把相邻的标识和内容拼接起来。
为什么你之前的尝试失败了?
我们来逐个分析:
(<\w{3}>.*):.*是贪婪匹配,会从第一个<AAA>开始一直匹配到字符串结尾,所以只返回一个结果。(<\w{3}>.*?):.*?是非贪婪模式,但没有终止条件,它会优先匹配0个字符,所以结果只拿到了每个分段标识本身。(<\w{3}>.+?):.+?要求至少匹配一个字符,但同样没有终止条件,非贪婪模式下只匹配到第一个字符就停止了,所以得到<AAA>q这类结果。
内容的提问来源于stack exchange,提问作者Bill Morgan
相关产品推荐
相关产品推荐

