单独查找正则表达式匹配

时间:2016-07-25 07:09:32

标签: python regex

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

#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]]+')
  • 搜索结果应该给出

    • group(1)= varName
    • group(2)= test_0x5F_u8

它没有在文件中找到变量。任何人都可以帮助我。

2 个答案:

答案 0 :(得分:2)

您需要添加一个可选组以匹配较长的模式。另外,要使用可选括号,您需要添加\(?^#define\s+(\w+)\s+((?:test_0x[0-9a-f]+_[a-z0-9]+\s+or\s+)?\(?test_0x[0-9a-f]+_[a-z0-9]+\)?)

re.I

this regex demo。请注意,它应与^标志一起使用,以使匹配不区分大小写。

模式说明

  • #define - 字符串开头
  • #define - 文字\s+
  • (\w+) - 1+空格
  • \s+ - 第1组捕获1个字的字符
  • ((?:test_0x[0-9a-f]+_[a-z0-9]+\s+or\s+)?\(?test_0x[0-9a-f]+_[a-z0-9]+\)?) - 同上。
  • (?:test_0x[0-9a-f]+_[a-z0-9]+\s+or\s+)? - 第2组捕获:
    • ? - 一个可选的(由于test_0x结尾的1或0次)序列
      • test_0x - [0-9a-f]+ substring
      • _[a-z0-9]+ - 一个或多个十六进制字符
      • \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')]

Python demo

var mailTo = db.DRAFT_DLs
    .Where(dd => dd.MX_DL == argMailTo)
    .Select(dd => new MailAddress(dd.EMAIL))
    .ToList();

string mailCc = db.DRAFT_DLs
    .Where(dd => dd.MX_DL == "ALL")
    .Select(dd => dd.EMAIL)
    .SingleOrDefault() ?? "";

// ...

mailTo.ForEach(rcpt => mail.To.Add(rcpt));
mail.CC.Add(mailCc);

答案 1 :(得分:0)

re.compile(r'^#define\s+(?i)(\w+)\s+[test_0[xX][0-9a-fA-F][a-z0-9]]+')

这个正则表达式中缺少很多东西。开头括号,5F后面的下划线和最后一个[a-z0-9]只会给出一个字符,而最后你有" u8",这是2个字符。显然它不会匹配。

这应该可以正常工作:

re.compile(r'^#define\s+(\w+)\s+\(test_0[xX][0-9a-fA-F]+_[a-z0-9]+\)')