2

次のような16進数の文字列があります(例)

'0x100x200x3f0x2d0x300x330xd0xa'

そして、ヘッダーの間のすべてのものを抽出したい

'0x100x200x3f0x2d'

そして尻尾

'0xd0xa'

上記の例では、正規表現を使用して抽出したい式は

'0x300x33'

一般に、検索される文字列は、任意の数の 2 桁の 16 進数で構成できます。私は次のことを試しました

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

これは私の例の文字列と一致しません! 0x少なくとも 1 回は文字列に含まれるように、正確に 2 つの 16 進数 (常に小文字、内側の角かっこ) が続く必要があります0-9a-f(外側の rect.bracket +)。私は何が欠けていますか?

4

2 に答える 2

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}短縮すると{2}):

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

もちろん、これにより、試合結果に2番目のグループが生成されます(2つのキャッチグループがあるため)。これを変更するには、コンテンツの前に。を付けて、内部グループを非キャプチャグループにします?:。つまり、(?:...)グループ化されますが、一致の結果は生成されません。

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

[]グループではなく文字クラスを繰り返そうとしています。したがって、基本的に任意の0x[0-9a-f]{2,2}文字数を要求しています (したがって、xxx​​x も一致します)。

これはうまくいくかもしれません:

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