Python正则表达式匹配字符串选项

时间:2014-06-26 15:35:20

标签: python regex

我是Python和Python RE的新手。

我正在尝试为ARM汇编代码创建一个解析器。我想为匹配条件分支指令制作正则表达式,可能是:

beq, bne, blt, bgt

我尝试了表格的正则表达式

'b[eq|ne|lt|gt]'

但这不匹配。有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:5)

您应该使用括号来表示选项,而不是方括号:

b(eq|ne|lt|gt)

你通常想要一个非捕获组:

b(?:eq|ne|lt|gt)

你也可以让它更优化一点:

b(?:eq|ne|[lg]t)

方括号将被理解为任何字符或字符范围。因此,[eq|ne|lt|gt]实际上有效地表示eq|ne中的任何一个(再次,因此它变得多余),等等

答案 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