-3

最初に数字を検索し、見つかったものを正規表現に置き換えます。

次に、変更された文字列 (?) を取得してスペースを検索し、見つかったものを正規表現に置き換えます。

しかし、私は間違った結果を得ます。

test0 = This book id 0076 has 6782e6a
test1 = This book id 0076 has 0xef34a

次の正規表現を使用しました。

b = re.sub(r"(0x[a-fA-F0-9]+|\d+)","[0-9]*", test0)
c = re.sub(r'[(\s)*]','[^\s"]*',b)

私の出力:

test0
b = This book id [0-9]* has [0-9]*e[0-9]*a
c = This[^\s]*book[^\s]*id[^\s]*[0-9][^\s]*[^\s]*has[0-9][^\s]*e[0-9][^\s]*a

test1
b = This book id [0-9]* has [0-9]*
c = This[^\s]*book[^\s]*id[^\s]*[0-9][^\s]*[^\s]*has[0-9][^\s]*

期待される出力:

test0
b = This book id [0-9]* has [0-9]*
c = This[^\s]*book[^\s]*id[^\s]*[0-9]*[^\s]*has[^\s]*[0-9]*

test1
b = This book id [0-9]* has [0-9]*
c = This[^\s]*book[^\s]*id[^\s]*[0-9]*[^\s]*has[^\s]*[0-9]*
4

4 に答える 4

0

文字列がすべて同じ形式の場合は、肯定的な後読みアサーションを使用して、 と の後に続くトークンを選択することもでき'id'ます'has'。そうすれば、複雑な正規表現を考え出す必要がなくなります。

ここのようなもの:

>>> a = 'This book id 0076 has 6782e6a'
>>> b = re.sub(r'(?<=id\s)\w+', '[0-9]*', a)
>>> b
'This book id [0-9]* has 6782e6a'
>>> c = re.sub(r'(?<=has\s)\w+', '[0-9]*', b)
>>> c
'This book id [0-9]* has [0-9]*'
于 2012-12-19T10:56:10.320 に答える
0

2 回目の読み取りで、見逃しているのは、実際には任意の 16 進文字列のビットに\s一致することであることに気付きました。xf0xf

あなたが何をしようとしているのか正確にはわかりませんが、たとえば次のように、文字列ビットが 16 進数に一致するのを避けるために、re.match でグループ化を使用する必要があるかもしれません。

In [16]: re.match("(0x[0-9a-fA-F]+)(hello)", "0xfhello").groups()
Out[16]: ('0xf', 'hello')

数値の 2 回目の実行は 10 進数の [0-9]+ または 16 進数の 0x[0-9a-fA-F]+ のいずれかである可能性があるため、正規表現は次のようになります。

([0-9]+)|(0x[0-9a-fA-F]+)

ただし、急いでいる場合は、両方を単一の不正確な正規表現に折りたたむことで取得できます。

[0-9a-fA-Fx]+
于 2012-12-19T10:43:25.857 に答える
0

正規表現の 2 番目の一致オプションは"(0x[a-fA-F0-9]+|\d+)"、文字列"6782e6a"に 2 回一致し、出力が得られます"[0-9]*" + "e" + "[0-9]*" + "a"

正規表現を次のように変更することをお勧めします"(?:0x)?[A-Z-a-Z0-9]+"

于 2012-12-19T10:44:46.300 に答える
0

最初の正規表現は(?<=\s)(0x)?[0-9a-fA-F]+(?=\s|$).

の 2 番目の数値stringは、先頭に . が付いていない 16 進数0xです。16 進数のみが で始まることが確実な場合は0x(0x[0-9a-fA-F]+)|\d+.

問題があります: 16 進数の前に a を付けない0xと、パターンは最終的coffeecafe,deadなどの英語の単語と一致する可能性があります。16 進数値の前に a を付ける必要があり0xます。

2 つ目は単純に(\s)+. との間に正規表現を入れる[]、内部のすべての文字が異なるものと見なされます。は、 または のいずれか[ab]の単一インスタンスを意味します。そのため、正規表現はs とs を2 回置き換えます。ab(\s)*[^\s]

于 2012-12-19T10:46:55.300 に答える