十六进制正则表达式字符串匹配不起作用(python)

时间:2012-12-11 10:17:24

标签: python regex hex

我有一个十六进制字符串,如下所示(例如)

'0x100x200x3f0x2d0x300x330xd0xa'

我希望提取标题之间的所有内容

'0x100x200x3f0x2d'

和尾巴

'0xd0xa'

在上面给出的示例中,我想使用正则表达式提取的表达式是

'0x300x33'

通常,搜索的字符串可以包含任意数量的两位十六进制数字。我试过以下

a = re.compile('0x100x200x3f0x2d([0x[0-9a-f]{2,2}]+)0xd0xa')

与我的示例字符串不匹配!我只需要0x后跟正好两个十六进制数字0-9a-f(总是小写,内部矩形括号),至少在字符串中一次(外部矩形。括号+)。我错过了什么?

2 个答案:

答案 0 :(得分:2)

  

所以一个人不应该有两个[]嵌套?

嵌套在字符组中的[将使外部字符组包含[字符。字符]将关闭第一个字符组,使第二个]成为静态字符。

所以你的正则表达式([0x[0-9a-f]{2,2}]+)将被解释为:

[0x[0-9a-f]{2,2}]+
^^^^^^^^^^^
character group with the characters: 0, x, [, 0-9, a-f
           ^^^^^
           two of those
                ^^
                followed by at least one ]

所以它会例如匹配以下奇怪的东西:

00]
00]]]]]]]]]
[[]
xx]
ff]

相反,你不需要一个字符组,而是一个普通的匹配组(注意{2,2}缩短为{2}):

((0x[0-9a-f]{2})+)

这当然会在匹配结果中生成第二个组(因为你有两个捕获组)。您可以通过在内容组前加?:前缀使内部组成为非捕获组来更改它,即(?:...)将分组,但不会在匹配中产生结果。

((?:0x[0-9a-f]{2})+)

答案 1 :(得分:1)

您正在尝试重复字符类[]而不是组。因此,您基本上要求任意数量的0x[0-9a-f]{2,2}个字符(因此xxxx也会匹配)。

这可能会更好:

a = re.compile('0x100x200x3f0x2d((0x[0-9a-f]{2})+)0xd0xa')