1

文字列内の部分文字列の位置を見つける必要があります。

部分文字列は、文字 ",0*" の後に [0-9] または [AF] の 2 文字が続きます。

kdjrnnj,0*B3;,w0l44
       ^^^^^
qui8ecc),0*21qxxcd4))
        ^^^^^

部分文字列の長さは常に正確に 5 文字です。部分文字列の前には、常にいくつかの (不明な) 文字があります。部分文字列の後に文字がある場合とない場合があります。

re.something を使用して、文字列内の部分文字列の開始位置を見つけたいと思います。私の正規表現の知識は非常に貧弱です - 誰かがこれを行う方法を教えてくれれば、ハッキングの時間を節約できます.

ありがとう

4

4 に答える 4

3

match オブジェクトstart()メソッドを使用します。

>>> r = re.compile(r',0\*[0-9A-F]{2}')
>>> m = r.search("kdjrnnj,0*B3;,w0l44")
>>> if m : print m.start()
7
>>> m = r.search("qui8ecc),0*21qxxcd4))")
>>> if m : print m.start()
8

次のステップは、部分文字列の後のすべてを削除することです

そのためのインデックスは必要ありません。これは正規表現でも実行できます。

>>> strs = "qui8ecc),0*21qxxcd4))"
>>> re.search(r'.*?,0\*[0-9A-F]{2}', strs).group()
'qui8ecc),0*21'

>>> m = r.search("kdjrnnj,0*B3;,w0l44")
>>> if m : print m.group()
kdjrnnj,0*B3

re.searchここよりも高速ですre.sub

>>> strs = 'kdjrnnj,0*B3;,w0l44'
>>> %timeit r.search(strs).group()
100000 loops, best of 3: 1.42 us per loop
>>> %timeit pattern.sub('', strs)
100000 loops, best of 3: 2.79 us per loop

>>> strs = 'kdjrnnj,0*B3;,w0l44'*1000
>>> %timeit r.search(strs).group()
100000 loops, best of 3: 1.43 us per loop
>>> %timeit pattern.sub('', strs)
10000 loops, best of 3: 59.9 us per loop

>>> strs = 'kdjrnnj'*1000 + ',0*B3;,w0l44'
>>> %timeit r.search(strs).group()
1000 loops, best of 3: 260 us per loop
>>> %timeit pattern.sub('', strs)
1000 loops, best of 3: 410 us per loop
于 2013-09-07T08:55:57.407 に答える
0

Pythonは、一致が行われるとインスタンスre.search()を返します。これには、一致した位置を提供するメソッドが含まれています。MatchObject().start()

import re

pattern = re.compile(r',0\*[0-9A-F]{2}')

match = pattern.search(inputstring)
if match:
    print match.start()

ただし、注意してください\*。アスタリスク ( *) は正規表現のメタ文字であるため、リテラルに一致させるにはスラッシュでエスケープする必要があります*

[0-9A-F]、2 つの名前付き範囲内の任意の文字に一致する文字クラスを定義します。次のクラスは、正確に2 文字の{2}一致に制限します。

デモ:

>>> import re
>>> pattern = re.compile(r',0\*[0-9A-F]{2}')
>>> match = pattern.search('kdjrnnj,0*B3;,w0l44')
>>> match.start()
7
>>> match.group()
',0*B3'
>>> match = pattern.search('qui8ecc),0*21qxxcd4))')
>>> match.start()
8
>>> match.group()
',0*21'

この文字列ののすべてを削除する必要がある場合は、re.sub()代わりに次を使用します。

pattern = re.compile(r'(?<=,0\*[0-9A-F]{2}).*')

newstring = pattern.sub('', oldstring)

これは後読みアサーションを使用します。それはあなたのパターンを探し、その後に続くすべてに一致し、re.sub()呼び出しは一致したものを入力文字列から削除します。

デモ:

>>> pattern = re.compile(r'(?<=,0\*[0-9A-F]{2}).*')
>>> pattern.sub('', 'kdjrnnj,0*B3;,w0l44')
'kdjrnnj,0*B3'
>>> pattern.sub('', 'qui8ecc),0*21qxxcd4))')
'qui8ecc),0*21'

,0*B3と の後のすべて,0*21が現在なくなっていることに注意してください。

于 2013-09-07T08:56:20.317 に答える
0

この正規表現は非常に単純です: .*,0\*[0-9A-F]{2}.

于 2013-09-07T08:56:35.387 に答える
0

使用re.search():

re.search(r',0*[0-9A-F][0-9A-F]', your_string).start()

于 2013-09-07T08:56:36.233 に答える