我是Python和Python RE的新手。
我正在尝试为ARM汇编代码创建一个解析器。我想为匹配条件分支指令制作正则表达式,可能是:
beq, bne, blt, bgt
我尝试了表格的正则表达式
'b[eq|ne|lt|gt]'
但这不匹配。有人可以帮帮我吗?
答案 0 :(得分:5)
您应该使用括号来表示选项,而不是方括号:
b(eq|ne|lt|gt)
你通常想要一个非捕获组:
b(?:eq|ne|lt|gt)
你也可以让它更优化一点:
b(?:eq|ne|[lg]t)
方括号将被理解为任何字符或字符范围。因此,[eq|ne|lt|gt]
实际上有效地表示e
,q
,|
,n
,e
中的任何一个(再次,因此它变得多余),等等
答案 1 :(得分:1)
尝试以下模式:b(?:eq|ne|lt|gt)
[]
字符集:仅匹配括号内的任何一个字符。您可以使用元字符-
指定一系列字符,例如:[a-e]
甚至可以使用元字符^
来否定表达式,例如:[^aeiou]
()
捕获肠胃外增加:用于分组部分&要创建数字捕获组,您可以通过在捕获实例中使用以下字符集?:
来禁用此功能,例如(?:)
如上所述,您应该使用capturing parentesis
来匹配多个字符,因此,这就是使用brackets
的模式与您的字符串不匹配的原因。
请注意,使用non capturing parentesis
意味着不保存任何匹配的数据,但是您可以删除元字符?:
以捕获该组。
由于python执行perl兼容的正则表达式引擎,你可以使用named captured groups & numbered backreferences
,使用它的主要优点是保持表达式易于维护,阅读,编辑等。
例如:
(?P<opcode>b(?:eq|ne|lt|gt))
- 将您的模式b(?:eq|ne|lt|gt)
的匹配项捕获到后引用名称opcode