0

以下に、ある文字列を別の文字列に置き換えるコードがありますが、そうではないようです。私は Python や正規表現の専門家ではありません。なぜこれがうまくいかないのか教えていただけますか。

def ReplaceCRC( file_path ):
    file = open(file_path,'r+');
    file_str = file.read()
    if( file_str <> '' ):
         crc_list        = re.findall(r'_CalcCRC[(]\s*"\w+"\s*[)]', file_str);
         strs_to_crc     = []
         new_crc_list    = []
         if( crc_list ):
              for crc in crc_list:
                   quote_to_crc    = re.search(r'"\w+"', crc);
                   str_to_crc      = re.search(r'\w+', quote_to_crc.group() ).group();
                   final           = hex(CalcCRC( str_to_crc ))[:2]
                   value           = '%08X' % CalcCRC( str_to_crc )
                   final           = final + value.upper()
                   final_crc       = Insert( crc, ', ' + final + ' ', -1)
                   new_crc_list.append( final_crc )
              if( new_crc_list <> [] ):
                   for i in range(len(crc_list)):
                       print crc_list[i]
                       print new_crc_list[i]
                       term = re.compile( crc_list[i] );
                       print term.sub( new_crc_list[i], file_str );

これは、操作対象のファイルです。

printf( "0x%08X\n", _CalcCRC("THIS_IS_A_CRC") );
printf( "0x%08X\n", _CalcCRC("PATIENT_ZERO") );

これが出力です

_CalcCRC("THIS_IS_A_CRC")
_CalcCRC("THIS_IS_A_CRC", 0x97DFEAC9 )
printf( "0x%08X\n", _CalcCRC("THIS_IS_A_CRC") );
printf( "0x%08X\n", _CalcCRC("PATIENT_ZERO") );

_CalcCRC("PATIENT_ZERO")
_CalcCRC("PATIENT_ZERO", 0x0D691C21 )
printf( "0x%08X\n", _CalcCRC("THIS_IS_A_CRC") );
printf( "0x%08X\n", _CalcCRC("PATIENT_ZERO") );

すべきことは、CRC 文字列を見つけて値を計算し、元の文字列のその場所に文字列を配置することです。私はたくさんのものを試してきましたが、何もうまくいかないようです。

4

3 に答える 3

1

あなたの問題ではありませんが、これらの3行は素晴らしいです:

final           = hex(CalcCRC( str_to_crc ))[:2]
value           = '%08X' % CalcCRC( str_to_crc )
final           = final + value.upper()

CalcCRCが非負の整数を返すと仮定します(例:12345567890

行1finalは、入力に関係なく「0x」に設定されます。

>>> hex(1234567890)
'0x499602d2'
>>> hex(1234567890)[:2]
'0x'

2行目はCalcCRCへの呼び出しを繰り返します!

>>> value           = '%08X' % 1234567890
>>> value
'499602D2'

すでに大文字でvalueあることに注意してください!

3行目以降finalは「0x499602D2」になります

二度と使用されないのでvalue、全体を次のように置き換えることができます

final = '0x%08X' % CalcCRC(str_to_crc)

婉曲法の街からもっと

これらの行:

quote_to_crc    = re.search(r'"\w+"', crc);
str_to_crc      = re.search(r'\w+', quote_to_crc.group() ).group();

次のいずれかに置き換えることができます。

str_to_crc = re.search(r'"\ w +"'、crc).group()[1:-1] str_to_crc = re.search(r'"(\ w +)"'、crc).group(1)

于 2011-04-22T08:46:49.430 に答える
0

本当の答えを簡単に見てみましょう:

re.escape() .... を使用するには (特に) 必要があります。

term = re.compile(re.escape(crc_list[i]))

最後のインデントifは詰まっているように見えます。

...さらに夕食後:-)

食後アップデート

ファイル全体で 3 つのパスを作成しますが、1 つだけでうまくいきます。膨大な混乱を排除することとは別に、主な革新はre.sub、置換を文字列ではなく関数にする機能を使用することです。

import re
import zlib

def CalcCRC(s):
    # This is an example. It doesn't produce the same CRC as your examples do.
    return zlib.crc32(s) & 0xffffffff

def repl_func(mobj):
    str_to_crc = mobj.group(2)
    print "str_to_crc:", repr(str_to_crc)
    crc = CalcCRC(str_to_crc)
    # If my guess about Insert(s1, s2, n) was wrong,
    # adjust the ollowing statement.
    return '%s"%s", 0x%08X%s' % (mobj.group(1), mobj.group(2), crc, mobj.group(3))

def ReplaceCRC(file_handle):
    regex = re.compile(r'(_CalcCRC[(]\s*)"(\w+)"(\s*[)])')
    for line in file_handle:
        print "line:", repr(line)
        line2 = regex.sub(repl_func, line)
        print "line2:", repr(line2)
    return

if __name__ == "__main__":
    import sys, cStringIO
    args = sys.argv[1:]
    if args:
        f = open(args[0], 'r')
    else:
        f = cStringIO.StringIO(r"""
printf( "0x%08X\n", _CalcCRC("THIS_IS_A_CRC") )
other_stuff()
printf( "0x%08X\n", _CalcCRC("PATIENT_ZERO") )
""")
    ReplaceCRC(f)

引数なしでスクリプトを実行した結果:

line: '\n'
line2: '\n'
line: 'printf( "0x%08X\\n", _CalcCRC("THIS_IS_A_CRC") )\n'
str_to_crc: 'THIS_IS_A_CRC'
line2: 'printf( "0x%08X\\n", _CalcCRC("THIS_IS_A_CRC", 0x98ABAC4B) )\n'
line: 'other_stuff()\n'
line2: 'other_stuff()\n'
line: 'printf( "0x%08X\\n", _CalcCRC("PATIENT_ZERO") )\n'
str_to_crc: 'PATIENT_ZERO'
line2: 'printf( "0x%08X\\n", _CalcCRC("PATIENT_ZERO", 0x76BCDA4E) )\n'
于 2011-04-22T09:18:23.127 に答える