Skip to main content
 首页 » 编程设计

python之单独查找正则表达式匹配

2024年10月17日31duanxz

我在文件中有我必须找到的变量

#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]+ - 同上。
  • \)? - 一个可选的 )。

Python demo :

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')]