2

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

'0x100x200x3f0x2d0x300x330xd0xa'

我想提取标题之间的所有东西

'0x100x200x3f0x2d'

和尾巴

'0xd0xa'

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

'0x300x33'

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

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

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

4

2 回答 2

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}缩短为 just {2}):

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

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

((?:0x[0-9a-f]{2})+)
于 2012-12-11T10:37:14.717 回答
1

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

这可能会更好:

a = re.compile('0x100x200x3f0x2d((0x[0-9a-f]{2})+)0xd0xa')
于 2012-12-11T10:20:18.337 回答