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