0

例えば:

blahblah|0A 4D 5E 43|adfsdasd|92| sgagrewas|12 5E|

になる必要があります

blahblahx0Ax4Dx5Ex43adfsdasdx92 sgagrewasx12x5E

私は次のようなことを試みています:re.sub(r'\|(\w+ ?)*\|', r'x\1', a)しかし、最初の試合以上にそれを機能させるのに問題があります。

更新:正規表現はこれには適切ではないようです。pyparsingソリューションは実行可能でしょうか?

そうでない場合は、単純な反復ソリューションを作成できますが、より拡張可能なものをお勧めします。しかし、最初の試合以上にうまく機能させるのに苦労しています。

UPDATE2:私は最終的に純粋なPythonアプローチを使用しました。これは正常に機能し、エスケープ文字も処理できます。

def strtohex(self, string):
    hexmode = False
    hexstring = ''
    i=0
    while i<len(string):
        if string[i] == '\\':
            i += 1
            #No escape charecters inside hex pipes
            hexstring += string[i]   
        elif string[i] == '|':
            hexmode = not hexmode
        elif string[i] == ' ':
            hexstring += '' if hexmode else  ' '
        else:
            if hexmode:
                hexstring += chr(int(string[i:i+2],16))
                i += 1
            else:
                hexstring += string[i]

        i += 1
    return hexstring
4

4 に答える 4

1

正規表現だけを使用してそれを行うことができると確信していますが、なぜわざわざするのですか?プログラミング言語の使い方は簡単です。

縦棒で弦を壊します。確認し、必要に応じて代用してください。再結合します。

line = 'blahblah|0A 4D 5E 43|adfsdasd|92| sgagrewas|12 5E|'
parts = line.split('|')
for i, s in enumerate(parts):
    if re.match(r'^([\dA-F]{2} )*[\dA-F]$', s):
    parts[i] = re.sub('^| ', 'x', s)
result = "".join(parts)

チェックは、サブストリング全体がスペースで区切られた2桁の16進数で構成されているかどうかです。あなたの例のように、すべての16進文字が大文字になっていると思います。

于 2013-02-18T15:08:31.810 に答える
1

これがpyparsingでどのように見えるかを次に示します。

from pyparsing import Word,hexnums,Suppress,OneOrMore

twoDigitHex = Word(hexnums,exact=2)
VERT = Suppress('|')

pattern = VERT + OneOrMore(twoDigitHex) + VERT

# attach parse action to prefix each 2-digit hex with 'x' and join all together
pattern.setParseAction(lambda t: ''.join('x'+tt for tt in t))

# take sample code, and use transformString to apply conversion
sample = "blahblah|0A 4D 5E 43|adfsdasd|92| sgagrewas|12 5E|"
print pattern.transformString(sample)

プリント

blahblahx0Ax4Dx5Ex43adfsdasdx92 sgagrewasx12x5E
于 2013-02-21T17:12:35.683 に答える
0

私は2回進みました:

  • 1番目にすべての16進値を置き換えます
  • 次に、空白を削除して|

それは与えます:

>>> s = 'blahblah|0A 4D 5E 43|adfsdasd|92| sgagrewas|12 5E|'
>>> re.sub(r'[| ]', r'', re.sub(r' ?([0-9A-F]{2})', r'x\1', s))
'blahblahx0Ax4Dx5Ex43adfsdasdx92sgagrewasx12x5E'
于 2013-02-18T14:25:51.670 に答える
0

Pythonはバランスの取れた正規表現に対応しているとは思いません。私の知る限り、.NETはそのようなサポートを備えた唯一のフレーバーです(そしてそれは非常に醜く見え、維持するのは悪夢です)。

パイプシンボルで文字列を分割してから文字列を再結合し、奇数番号の文字列配列アイテムに必要なフォーマットを(必要に応じて正規表現を介して)適用する方がよい場合があります。

編集:考え直してみると、これは可変長式のルックビハインドを使用して可能になると思いますが、残念ながらpythonはそれらをサポートしていません。(たとえば、の線に沿った何か(?<=^(?:[^|]*\|[^|]*\|)*[^|]*)\|(\w+ ?)*\|

于 2013-02-18T14:43:41.207 に答える