2011-04-29 27 views
2

我想从C头文件中删除宏,但是我在删除多行宏时遇到了问题。因此,例如Python中多行C宏的正则表达式

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

这是删除一个行宏正则表达式,但我不太清楚如何将\ n的正则表达式。

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

你还试图删除其他预处理结构,例如,条件编译(''#ifdef''等)?你目前的正则表达式会这样做,但这个问题只提到宏。 – Blair 2011-04-29 07:52:31

+0

是的,我想擦除所有的宏。这目前只会删除oneline宏,如#include“library.h”。我只是不太清楚如何在正则表达式中放置\\ n,它应该适用于每一个宏然后 – Blackie123 2011-04-29 07:56:51

+0

Nitpicking,但清晰度对于得到很好的答案很重要:我想你的意思是你想要清除所有的*预处理器指令*。一个宏(''#define ...'')是一个指令的类型,正如源包含(''#include ...'')和有条件包含(''#ifdef ...#endif'') 。请参阅Wikipedia上的[C预处理器](http://en.wikipedia.org/wiki/C_preprocessor)文章。 – Blair 2011-04-29 08:03:30

回答

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

应该做的伎俩

编辑:修复由@ Blackie123

+0

不是100%正确,但足以帮助我使它工作,谢谢。 – Blackie123 2011-04-29 08:04:11

+0

仅供其他人使用。这是工作的: text = re.sub('#([\ W \ w \ s \ d])*?(\ n。*?\\\\)* \ n','',text ,re.S | re.M) – Blackie123 2011-04-29 08:08:02

+0

是的,你是对的。我忘了重新引擎也需要双反斜杠......另一种解决方案是使用原始字符串(r'...') – cadrian 2011-04-29 08:25:55

0
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)