正则表达式匹配C中的赋值操作

时间:2017-10-11 12:26:02

标签: python regex

我试图编写一个正则表达式,在我已经提取的C语言的条件语句中捕获赋值相等的符号(使用python模块re)。

我的尝试:

exp = re.compile(r'\(\s*[0-9A-Za-z_]+\s*[^!<>=]=[^=]')

在处理多种情况时,它无法匹配如下字符串的简单情况:

'(c=getc(pp)) == EOF'

有人可以解释为什么我的正则表达式不匹配此字符串,我怎么能让它变得更好?我知道有些奇怪的案例可能仍然无法解决,但我可以手动对待,目的是自动完成大部分的工作。

2 个答案:

答案 0 :(得分:1)

[^!<>=]关注您的标识符会导致在=之后匹配c

如果您打算匹配作业,请尝试在标识符后面只匹配一个等号,如下所示:

exp = re.compile(r'\(\s*[0-9A-Za-z_]+\s*=[^=]')

print(exp.search('(c=getc(pp)) == EOF'))

导致:

<_sre.SRE_Match object; span=(0, 4), match='(c=g'>

答案 1 :(得分:1)

这不起作用的原因是[^!<>=]=,这会使您的代码查找不是=后跟=字符的字符。我可以看到你这样做的意图,但这是错误的方式。

对于简单的案例,请看下面的表达式:

[0-9A-Za-z_]+\s*=\s*[0-9A-Za-z_]+(\(\s*[0-9A-Za-z_]*\s*\))?

这与您的来源的c=getc(pp)部分匹配,因为它会查找=,其后跟(或前面)是可选的空格和字符或数字。这已经阻止正则表达式匹配==<=!=>=

除此之外,它还会查看右侧是函数还是仅仅是变量或只是数字(对于表达式末尾的括号部分,通过?可选匹配)。另请注意大括号(*)中匹配部分的[0-9A-Za-z_]*,这使您可以匹配没有参数的函数调用。

适用于:

(c=getc(p)) == EOF
(c =getc()) == EOF
(c=getc( )) == EOF
(c = getc( p )) == EOF
(c = i) == EOF
(c=10) == EOF

这不适用于x = y(z())等构造(当然还有更多)。

除此之外,我建议使用以下链接(不完全是您的问题,但非常好的见解): Regular expression to recognize variable declarations in C