如何用Python正则提取C++ #ifdef TYPEA块内的头文件引入语句
问题根因
你使用了re.match()进行匹配,该方法要求正则必须从字符串的第一个字符开始命中,所以你必须在正则开头加(\s*.*)才能匹配到#ifdef TYPEA,但同时也把前面所有无关内容都纳入了匹配结果。你去掉开头部分后re.match()从字符串开头找不到#ifdef TYPEA,自然返回空。
调整方案
把re.match()换成全局搜索的re.search(),同时调整正则用分组单独捕获你需要的内容即可:
import re pattern = re.compile( r'#ifdef\s+TYPEA\s*(.*?)(?=\s*#(?:else|endif))', re.DOTALL ) match = pattern.search(source_content) if match: desired_match = match.group(1) print(desired_match)
运行输出
#include "some_header.h" #include "some_other_header23.h"
完全符合预期,不需要额外处理即可拿到目标内容。
正则说明
#ifdef\s+TYPEA\s*:匹配带前后任意空白的#ifdef TYPEA行,末尾的\s*会吃掉该行末尾的换行符,避免结果开头多空行(.*?):非贪婪捕获所有内容,对应你需要的头文件行(?=\s*#(?:else|endif)):正向预查,匹配到带任意前导空白的#else或#endif就停止,不会把这两个标识纳入捕获结果re.DOTALL:让.可以匹配换行符,实现跨行匹配
如果你一定要保留re.match()用法,可以在正则开头加非贪婪匹配.*?,同样取group(1)即可:
pattern = re.compile( r'.*?#ifdef\s+TYPEA\s*(.*?)(?=\s*#(?:else|endif))', re.DOTALL ) match = pattern.match(source_content)
内容的提问来源于stack exchange,提问作者JE_Muc
相关产品推荐
相关产品推荐

