我试图编写一个正则表达式,在我已经提取的C语言的条件语句中捕获赋值相等的符号(使用python模块re
)。
我的尝试:
exp = re.compile(r'\(\s*[0-9A-Za-z_]+\s*[^!<>=]=[^=]')
在处理多种情况时,它无法匹配如下字符串的简单情况:
'(c=getc(pp)) == EOF'
有人可以解释为什么我的正则表达式不匹配此字符串,我怎么能让它变得更好?我知道有些奇怪的案例可能仍然无法解决,但我可以手动对待,目的是自动完成大部分的工作。
答案 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