为什么这个python正则表达式返回错误的字符串

2024-09-30 04:29:28 发布

您现在位置:Python中文网/ 问答频道 /正文

下面我有一段代码,应该用另一个字符串替换一个字符串,但似乎没有做到。我不是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 );

这是它正在操作的文件:

^{pr2}$

这是输出

_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字符串,计算该值,然后将一个字符串放在原始字符串的相应位置。我试了一大堆东西,但似乎都没用。在


Tags: to字符串renewisthislistfile
3条回答

这不是你的问题,但这三行是惊人的:

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

假设CalcCRC返回一个非负整数(例如12345567890

第1行将final设置为“0x”,与输入无关!在

^{pr2}$

第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_到_crc=搜索(r'“\w+”,crc).group()[1:-1] str_到_crc=搜索(r'(\w+“),crc).组(1)

这是你想要的吗?公司名称:

import re

def ripl(mat):
    return '%s, 0x%08X' % (mat.group(1),CalcCRC(mat.group(2)))

regx = re.compile(r'(_CalcCRC[(]\s*"(\w+)"\s*[)])')


def ReplaceCRC( file_path, regx = regx, ripl = ripl ):
    with open(file_path,'r+') as f:
        file_str = f.read()
        print file_str,'\n'
        if file_str:
             file_str = regx.sub(ripl,file_str)
             print file_str
             f.seek(0,0)
             f.write(file_str) 
             f.truncate()

编辑

我忘记了指令f.truncate(),非常重要,否则如果重写的内容比初始内容短,它仍然是尾部

一。在

编辑2

约翰·麦肯

没有错误,我上面的解决方案是正确的,它给出了

^{pr2}$

自从你的评论之后,我就没有改变过。我想我首先发布了一个不正确的解决方案(因为我执行了一些不同的测试来验证一些行为,而且,你知道,我有时会把我的文件和代码弄混),然后你复制了这个错误的代码来尝试它,然后我意识到有一个错误并更正了代码,然后你在没有注意到我的情况下发布了你的评论已经纠正了。我想没有别的原因造成这种混乱。在

顺便说一句,要获得同样的结果,在模式定义regx中甚至不需要两组,一组就足够了。以下regx和{}也可以工作:

regx = re.compile(r'_CalcCRC\(\s*"(\w+)"\s*\)')
# I prefer '\(' to '[(]', and same for '\)' instead of '[)]'

def ripl(mat):
    return '%s, 0x%08X' % (mat.group(),CalcCRC(mat.group(1)))

但仍存在不确定性。我们的每一个结果都是明智的,与乔不准确的措辞相对照。那么,他想要什么作为精确的结果呢?:值0x97DFEAC9必须像您的结果一样插入到CalcCRC("THIS_IS_A_CRC")中,还是像我一样插入到CalcCRC("THIS_IS_A_CRC")之后?在

总而言之,我希望您能获得一个可以运行的代码:我定义了一个我自己的函数CalcCRC(),它只包含在if x=="THIS_IS_A_CRC": return 0x97DFEAC9和{};我通过查看Joe在他的问题中公开的所需结果来选择这些关联。在

现在,关于你那讨厌的断言,我关于函数重新定义的观点是完全无稽之谈,我想我没有充分解释我的意思。将regexregx和函数ripl()作为函数ReplaceCRC()的参数的默认参数,结果是:对象regxripl()只创建一次,此时函数ReplaceCRC()的定义是执行。因此,如果在一次执行中多次应用ReplaceCRC(),则不会重新创建这些对象。我不知道函数ReplaceCRC()在Joe的程序执行过程中是否真的被调用了好几次,但我认为把这个特性放在代码中以防有用。也许,我应该在我的回答中强调这一点,而不是用注释来证明我的代码与你的代码相对应。但我尽量限制自己写答案的倾向,有时写得太长了。在

这些解释是否澄清了这些问题,减轻了你的烦恼?在

快速浏览一下真正的答案:

你需要(特别是)使用重新逃逸() .... 在

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

最后一个if上的缩进看起来很拥挤。在

。。。晚餐后再来点:-)

餐后更新

你对整个文件进行3次传递,而只有一次可以做到这一点。除了消除大量的混乱之外,主要的创新是使用re.sub功能,该功能允许替换为函数而不是字符串。在

^{pr2}$

运行不带参数的脚本的结果:

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'

相关问题 更多 >

    热门问题