【问题标题】:Regex match a function if only if it contains a specific variable正则表达式匹配一个函数,如果它包含一个特定的变量
【发布时间】:2021-01-07 12:00:20
【问题描述】:

我有这个从文件中读取的字符串。

    /**********************************************************************functionheaderstuff***********************************************************************************************************************/
void fn1(void)
{   
    b= 8;
}

/***********************************************************************functionheaderstuff***********************************************************************************************************************/

void fn2(int a, intb)
{   int c;

    var = 6;
}

我想匹配包含写入变量 var 的函数。

有了这个regex(?<=[*]{60}\/)(\s*\w+(?: \w+\s*)(?=(\((.*?)\)\s*{))).*(\bvar\b([^>=<!;{])*[=]{1}[^=]*?[;]),我匹配了这两个函数,因为 .* 是贪婪的。如果遇到}\s*\/[*]{60},我需要它不匹配,并且仅当函数包含正在写入的变量时才匹配,最好仅当变量不在注释中时才匹配。

负前瞻不起作用-((?<=[*]{60}\/)\s*\w+(?: \w+\s*)(?=(\((.*?)\)\s*{)).*)(?!(\s*}\s*\/[*]{60}))(\bvar\b([^>=<!;{])*[=]{1}[^=]*?[;])

我的函数将从我共享的函数头类型开始。查找写入的变量并识别函数可以正常工作。 如果函数包含从下一个函数获取的 var ,则此正则表达式可以正常工作。我在这里做错了什么?

【问题讨论】:

  • 您可以通过更简单的方式实现您的目标。这不必在一个正则表达式中。
  • 我花了很多时间试图解决这个问题。最好能做到这一点。如果有更简单的方法,您介意指出吗?
  • 用正则表达式解析 C 代码就像用正则表达式解析 HTML 一样疯狂。请改用适当的解析器。
  • 疯了,因为总会有更多的极端案例?我几乎得到了我需要的东西,即跨文件和函数提取全局变量信息

标签: python regex regex-lookarounds


【解决方案1】:

我改变了方法,得到了我需要的东西。我最初删除了所有的 cmets。我匹配了字符串中的函数并将其列在列表中。然后检查变量。 Python code

import regex
text = """void fn1(void){       b= 8;} void fn2(int a, intb){   int c;    var = 6;}"""

#checks for complete function definition
string1 = r'\w+(?:\s+\w+)*\w+[(][\w,\.*\s&\[\]]*[)]\s*({(?:[^{}]++|(?1))*})'

varwrite = r'\bvar\b([^>=<!;{])*[=]{1}[^=]*?[;]'
reg = regex.compile(varwrite,regex.MULTILINE )
y =[x.group() for x in regex.finditer(string1,text,regex.DOTALL)]
print(y)
for line in range(len(y)):
    if reg.search(y[line]):
        z =y[line].split('(',1)[0]
        print(z.split()[-1])

【讨论】:

    猜你喜欢
    • 2017-10-14
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2015-06-01
    相关资源
    最近更新 更多