我在文件中有我必须找到的变量
#define varName (test_0x5F_u8)
#define varName1 test_0xFF_u16
我无法匹配下面提到的表达式
test_0xFF_u16 and (test_0x5F_u8)
- 我想单独找到这些变量
- 测试是普通文本和第一个匹配
- 0x5F 是第二场比赛
- u8 是第三场比赛
Python代码
re.compile(r'^#define\s+(?i)(\w+)\s+[test_0[xX][0-9a-fA-F][a-z0-9]]+')
搜索结果应该给这个
- 组(1) = 变量名
- 组(2) = test_0x5F_u8
它没有在文件中找到变量。谁能帮我解决这个问题。
请您参考如下方法:
您需要添加一个可选组来匹配较长的模式。此外,要使用可选括号,您需要添加 \)? 和 \(?。
^#define\s+(\w+)\s+((?:test_0x[0-9a-f]+_[a-z0-9]+\s+or\s+)?\(?test_0x[0-9a-f]+_[a-z0-9]+\)?)
参见 this regex demo .请注意,它应该与 re.I 标志一起使用,以使匹配不区分大小写。
模式解释:
^- 字符串的开始#define- 文字文本#define\s+- 1+ 个空格(\w+)- 第 1 组捕获 1+ 个单词字符\s+- 同上。((?:test_0x[0-9a-f]+_[a-z0-9]+\s+或\s+)?\(?test_0x[0-9a-f]+_[ a-z0-9]+\)?)- 第 2 组捕获:(?:test_0x[0-9a-f]+_[a-z0-9]+\s+or\s+)?- 可选(1 次或 0 次,因为?最后)的序列test_0x-test_0x子串[0-9a-f]+- 1 个或多个十六进制字符_[a-z0-9]+- 一个下划线和 1+ 个字母数字字符\s+or\s+-or包含 1+ 个空格
\(?- 可选的(test_0x[0-9a-f]+_[a-z0-9]+- 同上。\)?- 一个可选的)。
import re
p = re.compile(ur'^#define\s+(\w+)\s+((?:test_0x[0-9a-f]+_[a-z0-9]+\s+or\s+)?\(?test_0x[0-9a-f]+_[a-z0-9]+\)?)', re.IGNORECASE | re.MULTILINE)
s = u"#define varName test_0x5F_u8 or (test_0x5F_u8)\n#define varName (test_0x5F_u8)\n#define varName test_0x5F_u8"
print([x for x in p.findall(s)])
// => [(u'varName', u'test_0x5F_u8 or (test_0x5F_u8)'), (u'varName', u'(test_0x5F_u8)'), (u'varName', u'test_0x5F_u8')]
