我有一个十六进制字符串,如下所示(例如)
'0x100x200x3f0x2d0x300x330xd0xa'
我希望提取标题之间的所有内容
'0x100x200x3f0x2d'
和尾巴
'0xd0xa'
在上面给出的示例中,我想使用正则表达式提取的表达式是
'0x300x33'
通常,搜索的字符串可以包含任意数量的两位十六进制数字。我试过以下
a = re.compile('0x100x200x3f0x2d([0x[0-9a-f]{2,2}]+)0xd0xa')
与我的示例字符串不匹配!我只需要0x
后跟正好两个十六进制数字0-9a-f
(总是小写,内部矩形括号),至少在字符串中一次(外部矩形。括号+
)。我错过了什么?
答案 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')