Python正则表达式re.split()拆分时如何同时获取分隔符实例?
当然可以!两种优雅的方法帮你搞定
你提到不想手动处理列表位置避免bug,那这两种方法应该很适合你:
方法1:带捕获组的re.split()
当你在正则表达式里给分隔符加上捕获组()时,re.split()会把分隔符也保留在结果列表里。这样你就能轻松把分隔符和对应的内容配对起来:
import re string = '$aText$bFor$cStack$dOverflow' # 给分隔符加上捕获组 split_result = re.split(r'(\$\w)', string) # split_result 现在是:['', '$a', 'Text', '$b', 'For', '$c', 'Stack', '$d', 'Overflow'] # 跳过开头的空字符串,然后两两配对分隔符和内容 separator_content_pairs = list(zip(split_result[1::2], split_result[2::2])) print(separator_content_pairs) # 输出:[('$a', 'Text'), ('$b', 'For'), ('$c', 'Stack'), ('$d', 'Overflow')]
方法2:用re.finditer()直接匹配(更推荐)
这种方法逻辑更直观,直接一次性匹配出每个分隔符和它对应的后续内容,完全不需要处理拆分后的索引问题,从根源上避免手动处理位置的bug:
import re string = '$aText$bFor$cStack$dOverflow' # 正则解释:匹配分隔符(\$\w),然后匹配后续内容直到下一个分隔符或字符串结束 pattern = re.compile(r'(\$\w)(.*?)(?=\$\w|$)') # 遍历所有匹配结果,提取分隔符和内容 separator_content_pairs = [ (match.group(1), match.group(2)) for match in pattern.finditer(string) ] print(separator_content_pairs) # 同样得到:[('$a', 'Text'), ('$b', 'For'), ('$c', 'Stack'), ('$d', 'Overflow')]
如果之后你需要把分隔符和内容分成两个独立的列表,只需要用zip(*)拆分即可:
separators, contents = zip(*separator_content_pairs) print(separators) # ('$a', '$b', '$c', '$d') print(contents) # ('Text', 'For', 'Stack', 'Overflow')
内容的提问来源于stack exchange,提问作者jsamsf
相关产品推荐
相关产品推荐

