【问题标题】:Regexp for multiple line C macro in PythonPython中多行C宏的正则表达式
【发布时间】:2011-04-29 07:48:12
【问题描述】:

我正在尝试从 C 标头中删除宏,但在删除多行宏时遇到问题。比如

#define macro(char)  \
//macro still continues \
//macro still continues \

这是删除单行宏的正则表达式,但我不太确定如何在正则表达式中包含 \n。

text=re.sub('#([\W\w\s\d])*?\n', '', text, re.S)

【问题讨论】:

  • 您是否还尝试删除其他预处理器结构,例如条件编译(#ifdef 等)?您当前的正则表达式会这样做,但问题只提到宏。
  • 是的,我想删除所有宏。这目前仅删除单行宏,例如 #include "library.h"。我只是不太确定如何将 \\n 放入正则表达式中,然后它应该适用于每个宏
  • 吹毛求疵,但清晰对于获得好的答案很重要:我认为您的意思是要删除所有 预处理器指令。宏 (#define ...) 是一种指令,源包含 (#include ...) 和条件包含 (#ifdef ... #endif) 也是如此。请参阅维基百科上的 C preprocessor 文章。
  • 哦对不起,没仔细看。就条件包含而言,我只想删除 #ifdef 和 #endif 而不是之间的代码。

标签: python regex macros


【解决方案1】:
text=re.sub('#([\W\w\s\d])*?(\n.*?\\\\)*\n', '', text, re.S | re.M)

应该做的伎俩

编辑:由@Blackie123修复

【讨论】:

  • 不是 100% 正确,但足以帮助我完成它,谢谢。
  • 只为其他人。这是有效的: text=re.sub('#([\W\w\s\d])*?(\n.*?\\\\)*\n', '', text, re .S | re.M)
  • 是的,你是对的。我忘记了重新引擎也需要双反斜杠......另一种解决方案是使用原始字符串 (r'...')
【解决方案2】:
text=re.sub(r'^\s*#(?:.*\\\r?\n)*.*$', '', text, flags=re.MULTILINE)

这是删除文本中的所有多行宏。有一个 \r?\n 用于与 Windows 行尾兼容。一件重要的事情是在标志之前写 "flags=" ,因为 re.sub() 中的第四个参数是一个计数,所以上面接受的答案是完全错误的,并且方法将指定的标志解释为计数参数。

https://docs.python.org/3/library/re.html#re.sub

Bug in Python Regex? (re.sub with re.MULTILINE)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 2010-09-08
    • 2014-04-18
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    相关资源
    最近更新 更多