我在文件中有变量,我必须找到
#define varName (test_0x5F_u8)
#define varName1 test_0xFF_u16
我无法匹配下面提到的表达
test_0xFF_u16 and (test_0x5F_u8)
Python代码
re.compile(r'^#define\s+(?i)(\w+)\s+[test_0[xX][0-9a-fA-F][a-z0-9]]+')
搜索结果应该给出
它没有在文件中找到变量。任何人都可以帮助我。
答案 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')]
。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]+\)')