Python C中赋值操作的Regexp匹配

Python C中赋值操作的Regexp匹配,python,regex,Python,Regex,我正在尝试编写一个regexp,它捕获我已经提取的C语言条件语句中的等号赋值(使用python模块re) 我的尝试: exp = re.compile(r'\(\s*[0-9A-Za-z_]+\s*[^!<>=]=[^=]') 有人能解释一下为什么我的regexp与这个字符串不匹配,以及如何使它更好?我知道有些奇怪的情况我可能仍然不知道,但我可以手动处理,目的是自动完成大部分的腿部工作。[^!=]遵循您的标识符可以防止=在c之后匹配 如果要匹配指定,请尝试仅匹配标识符后的一个等号,

我正在尝试编写一个regexp,它捕获我已经提取的C语言条件语句中的等号赋值(使用python模块
re

我的尝试:

exp = re.compile(r'\(\s*[0-9A-Za-z_]+\s*[^!<>=]=[^=]')
有人能解释一下为什么我的regexp与这个字符串不匹配,以及如何使它更好?我知道有些奇怪的情况我可能仍然不知道,但我可以手动处理,目的是自动完成大部分的腿部工作。

[^!=]
遵循您的标识符可以防止
=
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'>

这不起作用的原因是
[^!=]=
,这使代码查找一个不是
=
的字符,后跟一个
=
的字符。我知道你这样做的意图,但这是错误的

对于简单案例,请查看以下表达式:

[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())
(当然还有更多)

除此之外,我推荐以下链接(不完全是你的问题,但非常好的见解):

要匹配的范围“小于,不同”。。。阻止匹配,因为它包含=@Jean Françoisfare我如何避免
==
的匹配=那么?为什么不直接编译(r'\(\s*[0-9A-Za-z\]+\s*=[^=])
那么,这将匹配一个等号,其他什么都不匹配。它似乎确实有效,我正在测试它一点,如果你回答这个问题,我可能会接受你的答案!谢谢!我确实匹配了更多的情况,比如我用你的regexp给出的示例,但有一点我不太明白。这个regexp没有锚定,但它不匹配任何str以其他内容开头的字符串,例如另一个括号或空白。例如
'(c=getc(pp))==EOF'
不匹配。为什么呢?因为你使用的是
match
,我使用的是
search
哦,好吧,我对
re
模块了解得不够好!再次感谢你,我接受了你的答案,很高兴从图卢森的一位同事那里得到了帮助;)我只是希望我没有帮助一位竞争对手:)(注:我不在乎)由于我为CNES的分包商工作,我们应该很好:)感谢您的补充见解!不客气。如果您在表达式中投入更多精力,请告诉我们您的解决方案。除了将
&\->*
添加到变量名对应的集合中以考虑结构、指针和地址之外,我很惊讶我的regexp知识非常基础,所以我不知道还能做什么!
(c=getc(p)) == EOF
(c =getc()) == EOF
(c=getc( )) == EOF
(c = getc( p )) == EOF
(c = i) == EOF
(c=10) == EOF