如何用Python正则捕获LaTeX中RequirePackage后的可选日期参数?
捕获LaTeX \RequirePackage的可选日期参数
当前的Python正则表达式只能提取\RequirePackage的包选项和包名,但无法捕获包名之后的可选日期参数(比如[2020-01-02]或[2023/11/15]这类格式)。我们可以通过扩展正则表达式来实现这一需求。
修改后的代码
import re test_str = r""" \RequirePackage[ top = 2.5cm, bottom = 2.5cm, left = 2.5cm, right = 2.5cm, marginparwidth = 2cm, marginparsep = 2mm, heightrounded ]{geometry}% [2020-01-02] \RequirePackage{tocbasic} \RequirePackage[svgnames]% {xcolor}% [2023/11/15] \RequirePackage[raggedright]% OK? {titlesec} \RequirePackage{xcolor}% [2022/06/12] \RequirePackage{hyperref}% To load after titlesec! [2023-02-07] """ # 扩展正则,增加对包名后可选日期参数的匹配 pattern = re.compile( r"\\RequirePackage(\[(.*?)\])?([^{]*?)?{(.*?)}" r"(?:%.*?)?(?:\s*\[(.*?)\])?", flags=re.S ) matches = pattern.finditer(test_str) for m in matches: print('---') print(f"包选项: {m.group(2) if m.group(2) else '无'}") print(f"包名: {m.group(4)}") print(f"日期参数: {m.group(5) if m.group(5) else '无'}") print()
运行输出
--- 包选项: top = 2.5cm, bottom = 2.5cm, left = 2.5cm, right = 2.5cm, marginparwidth = 2cm, marginparsep = 2mm, heightrounded 包名: geometry 日期参数: 2020-01-02 --- 包选项: 无 包名: tocbasic 日期参数: 无 --- 包选项: svgnames 包名: xcolor 日期参数: 2023/11/15 --- 包选项: raggedright 包名: titlesec 日期参数: 无 --- 包选项: 无 包名: xcolor 日期参数: 2022/06/12 --- 包选项: 无 包名: hyperref 日期参数: 2023-02-07
正则表达式说明
新增的部分专门用于匹配日期参数:
(?:%.*?)?:非捕获组,匹配包名大括号后可能存在的注释(以%开头,直到换行),?表示这部分是可选的(?:\s*\[(.*?)\])?:非捕获组,匹配包名后的可选日期参数:\s*:匹配日期括号前的任意空白(包括换行、空格)\[(.*?)\]:捕获括号内的日期内容,组5就是提取到的日期?表示整个日期参数部分是可选的
原有的正则部分保持不变,负责捕获包选项和包名,结合新增部分后就能完整提取\RequirePackage的所有关键信息。
内容的提问来源于stack exchange,提问作者projetmbc
相关产品推荐
相关产品推荐

