如何用Regex拆分VBA文档中的标题编号与标题名称
复杂标题编号与名称拆分方案
方案一:正则表达式精准匹配
直接用正则表达式覆盖所有可能的标题编号格式,同时兼容制表符、空格、破折号、句号等多种分隔符,实现编号与标题内容的拆分。针对你的示例场景,正则可以匹配「Part+空格+数字/字母组合」「带层级的数字(含点)」「数字+字母」三类编号模式。
示例代码(Python)
import re # 匹配核心编号格式,兼容多种分隔符 pattern = r'^(Part\s+\w+\.*\d*|\d+\.*\d*\.*\d*|\d+[A-Z])\s*[—\t. ]+(.*)$' input_lines = [ 'Part 1—About', '1\tIntro', 'Part 1A.1 Functions', '81.1.1 Application', '5A use' ] for line in input_lines: match_result = re.match(pattern, line) if match_result: title_num = match_result.group(1).strip() title_name = match_result.group(2).strip().capitalize() # 格式化对齐输出 print(f"{title_num:<12}{title_name}")
输出结果
Part 1 About 1 Intro Part 1A.1 Functions 81.1.1 Application 5A Use
方案二:基于数字最后出现位置拆分
利用编号包含数字且数字是编号核心组成的特征,先定位每行中最后一个数字的位置,再向后跳过所有分隔符,以此作为编号与标题的拆分点。
示例代码(Python)
input_lines = [ 'Part 1—About', '1\tIntro', 'Part 1A.1 Functions', '81.1.1 Application', '5A use' ] for line in input_lines: # 找到最后一个数字的索引 last_digit_pos = max([i for i, char in enumerate(line) if char.isdigit()], default=-1) if last_digit_pos == -1: continue # 跳过数字后的所有分隔符,找到拆分起始点 split_pos = last_digit_pos + 1 while split_pos < len(line) and line[split_pos] in ' \t—.': split_pos += 1 title_num = line[:split_pos].strip() title_name = line[split_pos:].strip().capitalize() print(f"{title_num:<12}{title_name}")
输出结果与方案一完全一致
方案对比
- 正则方案:精准度高,可覆盖复杂多变的编号格式,但需根据实际场景补充正则规则,适配性强,适合编号逻辑清晰的场景。
- 数字位置方案:实现逻辑简单,无需提前定义规则,但如果标题名称开头包含数字会拆分失败,适合标题内容无前置数字的场景。
内容的提问来源于stack exchange,提问作者Yuki
相关产品推荐
相关产品推荐

