【问题标题】:regex for parsing variable names用于解析变量名的正则表达式
【发布时间】:2012-09-21 07:24:42
【问题描述】:

我正在尝试获取变量名称并将其存储在一个列表中,但是我在提出正则表达式时遇到了麻烦。所以,我有一个文件,如下所示:

float func(float a, float b, float c)
{
   float i, j,           k;
   float2 w;
}

我想做的是获取函数的名称以及参数 var 和 local var。所以,我希望我的正则表达式返回funcabcijkw

我目前的正则表达式是\bfloat*\d* +\w*\b

找到float funcfloat afloat bfloat cfloat ifloat w。我不确定如何分隔浮点部分,并且只使用正则表达式获取 var 名称(我想我可以使用捕获组)但我不确定当同一行上有多个 var 名称时该怎么办。另外,我只对浮点类型的变量感兴趣。任何提示都会有所帮助。

已编辑 我刚想出了这个正则表达式\bfloat*\d* +\w*[ *,* *\w]*\b,它符合我的需要,但我可以只用一个正则表达式来分组获得名称吗?

【问题讨论】:

  • 正则表达式不是一种非常可靠的代码解析方式。如果您仍想使用它们,您是否有机会使用 .NET 或其他支持可变长度后视的正则表达式实现?没有它们,即使不是不可能,也很难在单个正则表达式中做到这一点。
  • nop ;/ 我只是在 python 中使用 re 模块执行此操作。但是我刚刚用新的正则表达式编辑了我的帖子,你能看看它是否有任何问题吗?
  • 这是我可以接近的float2?\s+(\w+)(?:,\s*(?!float)(\w+)\s*)*RegexHero 中测试它,但问题是它不会捕获j,因为我使用的是重复捕获组,它每次都会覆盖匹配项找到一个新匹配,因此 jk 覆盖。

标签: regex


【解决方案1】:

这是您可以分两步执行此操作的方法,因为我很确定在单个正则表达式中执行此操作是不可能的:

import re

data = '''float func(float a, float b, float c)
{
   float i, j,           k;
   float2 w;
   float a, int b;
}'''
regex = re.compile(r'\bfloat2?\s+(\w+(?:,\s*(?!\w+\s+\w+)\w+)*)')
var_list = []
for vars in regex.findall(data):
    vars = (v.strip() for v in vars.split(','))
    var_list.extend((v for v in vars if v))

print var_list
# ['func', 'a', 'b', 'c', 'i', 'j', 'k', 'w', 'a']

这仅对您的正则表达式进行了微小的更改,以便捕获组包含所有逗号分隔的float 值,然后在for 循环中,我们拆分逗号分隔的值并将它们添加到结果列表中。

【讨论】:

  • 感谢您的回复。但是如果输入数据是 float a, int b; 呢?它还将捕获int 作为变量名称
  • @overloading - 查看我的编辑,现在应该可以正常工作。请注意,正则表达式仍然是解析任意代码的不好方法。
  • 谢谢,你能解释一下?: 的作用吗?此外,我使用 regexr 构建器在线测试了您的 regex,它适用于变量后有换行符的情况,例如 float a, //space and \n here b; 并解析 a 和 b,即使 a 和 b 之间有新行和空格。但是当我用相同的正则表达式在python中测试它时,它只会捕获a而不是b,你知道为什么吗?
  • ?: 使组不被捕获,这在这里很重要,因为re.findall() 将返回组的元组。我不确定为什么正则表达式的行为不同,但也许你应该使用[ \t] 而不是\s,因为\s 将匹配可能没有必要的换行符。
  • 最简单的方法是对re.sub使用完全相同的模式,并使用一个函数进行替换(参见docs on re.sub)。你或许可以使用lambda m: m.group(0).replace('\n', ' ')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2013-12-31
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多