智能替换重复值python

智能替换重复值python,python,replace,Python,Replace,所以我有一个文件,我想逐行替换一些非常相似的单词,实际上其中一些是其他单词的子字符串: uint8=("UINT8 ","PIN_UINT8 ") uint16=("UINT16 ","PIN_UINT16 ") uint32=("UINT32 ","PIN_UINT32 ") uint64=("UINT64 ","PIN_UINT64 ") int8=("INT8 ","PIN_INT32 ") int16=("INT16 ","PIN_INT16 ") int32=("INT32 ","PI

所以我有一个文件,我想逐行替换一些非常相似的单词,实际上其中一些是其他单词的子字符串:

uint8=("UINT8 ","PIN_UINT8 ")
uint16=("UINT16 ","PIN_UINT16 ")
uint32=("UINT32 ","PIN_UINT32 ")
uint64=("UINT64 ","PIN_UINT64 ")
int8=("INT8 ","PIN_INT32 ")
int16=("INT16 ","PIN_INT16 ")
int32=("INT32 ","PIN_INT32 ")
int64=("INT64 ","PIN_INT64 ")
这些是替代品。但是我需要小心,因为
INT8
UINT8
的子字符串,所以即使我有匹配项,我也需要检查它是
UINT8
还是
INT8

我已经写了一些代码,但还远远不能工作

while pos!=-1:
                                print line[pos:]
                                if "INT8 " in line[pos:]:
                                    pos=line.find("INT8",pos_final)
                                    if "U" == line[pos-1]:
                                        line = line.rstrip().replace(*uint8)
                                    else:
                                        print line[pos-1]
                                        line = line.rstrip().replace(*int8)
                                    pos+=5 #len(PIN_)+1
                                elif "INT16 " in line[pos:]:
                                    pos=line.find("INT16",pos_final)
                                    if "U" == line[pos-1]:
                                        line = line.rstrip().replace(*uint16)
                                    else:
                                        print line[pos-1]
                                        line = line.rstrip().replace(*int16) 
                                    pos+=5                       
                                elif "INT32 " in line[pos:]:
                                    pos=line.find("INT32",pos_final)
                                    if "U" == line[pos-1]:
                                        line = line.rstrip().replace(*uint32)
                                    else:
                                        print line[pos-1]
                                        line = line.rstrip().replace(*int32) 
                                    pos+=5                       
                                elif "INT64 " in line[pos:]:
                                    pos=line.find("INT64",pos_final)
                                    if "U" == line[pos-1]:
                                        line = line.rstrip().replace(*uint64)
                                    else:
                                        print line[pos-1]
                                        line = line.rstrip().replace(*int64)
                                    pos+=5
                                else:
                                    pos =-1
这里有一些文件行,以便您知道响应是否正确且有效:


您可以使用re模块来完成,请尝试下面的代码

import re
text = """UINT32 CacheSize() const { return _cacheSize; }
    UINT32 LineSize() const { return _lineSize; }
    UINT32 Associativity(UINT64 obj, INT8 obj2) const { return _associativity; }
    VOID SplitAddress(const ADDRINT addr, CACHE_TAG & tag, UINT32 & setIndex) const
    VOID SplitAddress(const ADDRINT addr, CACHE_TAG & tag, UINT32 & setIndex, UINT32 & lineIndex) const
    {
        const UINT32 lineMask  = _lineSize - 1 INT8;
"""

for line in text.split("\n"):
    line = re.sub("UINT8 ","PIN_UINT8 ", line)
    line = re.sub("UINT16 ","PIN_UINT16 ", line)
    line = re.sub("UINT32 ","PIN_UINT32 ", line)
    line = re.sub("UINT64 ","PIN_UINT64 ", line)
    line = re.sub("[^UPIN_]INT8 ","PIN_INT32 ", line)
    line = re.sub("[^UPIN_]INT16 ","PIN_INT16 ", line)
    line = re.sub("[^UPIN_]INT32 ","PIN_INT32 ", line)
    line = re.sub("[^UPIN_]INT64 ","PIN_INT64 ", line)
    print "\t\t",line
输出

PIN_UINT32 CacheSize() const { return _cacheSize; }
PIN_UINT32 LineSize() const { return _lineSize; }
PIN_UINT32 Associativity(PIN_UINT64 obj,PIN_INT32 obj2) const { return _associativity; }
VOID SplitAddress(const ADDRINT addr, CACHE_TAG & tag, PIN_UINT32 & setIndex) const
VOID SplitAddress(const ADDRINT addr, CACHE_TAG & tag, PIN_UINT32 & setIndex, PIN_UINT32 & lineIndex) const
{
    const PIN_UINT32 lineMask  = _lineSize - 1PIN_INT32 ;

您可以使用re模块来完成,请尝试下面的代码

import re
text = """UINT32 CacheSize() const { return _cacheSize; }
    UINT32 LineSize() const { return _lineSize; }
    UINT32 Associativity(UINT64 obj, INT8 obj2) const { return _associativity; }
    VOID SplitAddress(const ADDRINT addr, CACHE_TAG & tag, UINT32 & setIndex) const
    VOID SplitAddress(const ADDRINT addr, CACHE_TAG & tag, UINT32 & setIndex, UINT32 & lineIndex) const
    {
        const UINT32 lineMask  = _lineSize - 1 INT8;
"""

for line in text.split("\n"):
    line = re.sub("UINT8 ","PIN_UINT8 ", line)
    line = re.sub("UINT16 ","PIN_UINT16 ", line)
    line = re.sub("UINT32 ","PIN_UINT32 ", line)
    line = re.sub("UINT64 ","PIN_UINT64 ", line)
    line = re.sub("[^UPIN_]INT8 ","PIN_INT32 ", line)
    line = re.sub("[^UPIN_]INT16 ","PIN_INT16 ", line)
    line = re.sub("[^UPIN_]INT32 ","PIN_INT32 ", line)
    line = re.sub("[^UPIN_]INT64 ","PIN_INT64 ", line)
    print "\t\t",line
输出

PIN_UINT32 CacheSize() const { return _cacheSize; }
PIN_UINT32 LineSize() const { return _lineSize; }
PIN_UINT32 Associativity(PIN_UINT64 obj,PIN_INT32 obj2) const { return _associativity; }
VOID SplitAddress(const ADDRINT addr, CACHE_TAG & tag, PIN_UINT32 & setIndex) const
VOID SplitAddress(const ADDRINT addr, CACHE_TAG & tag, PIN_UINT32 & setIndex, PIN_UINT32 & lineIndex) const
{
    const PIN_UINT32 lineMask  = _lineSize - 1PIN_INT32 ;

我假设您的文件中没有
INT7
s

import re
text = """UINT32 CacheSize() const { return _cacheSize; }
    UINT32 LineSize() const { return _lineSize; }
    UINT32 Associativity(UINT64 obj, INT8 obj2) const { return _associativity; }
    VOID SplitAddress(const ADDRINT addr, CACHE_TAG & tag, UINT32 & setIndex) const
    VOID SplitAddress(const ADDRINT addr, CACHE_TAG & tag, UINT32 & setIndex, UINT32 & lineIndex) const
    {
        const UINT32 lineMask  = _lineSize - 1 INT8;
"""
for line in text.split("\n"):
    print re.sub(r'(U?INT\d+?)',r'PIN_\1', line)

我假设您的文件中没有
INT7
s

import re
text = """UINT32 CacheSize() const { return _cacheSize; }
    UINT32 LineSize() const { return _lineSize; }
    UINT32 Associativity(UINT64 obj, INT8 obj2) const { return _associativity; }
    VOID SplitAddress(const ADDRINT addr, CACHE_TAG & tag, UINT32 & setIndex) const
    VOID SplitAddress(const ADDRINT addr, CACHE_TAG & tag, UINT32 & setIndex, UINT32 & lineIndex) const
    {
        const UINT32 lineMask  = _lineSize - 1 INT8;
"""
for line in text.split("\n"):
    print re.sub(r'(U?INT\d+?)',r'PIN_\1', line)

只需在int替换之前进行uint替换,它就可以工作了……也许可以使用正则表达式-
re
module@L3viathan将
INT8
更改为
PIN\u INT8
PIN\u UINT8
更改为
PIN\u UINT8
@furas啊,说得好,没想到。尝试
re.sub(r'(U?INT\d+?)',r'PIN\U\1',line)
。只需在INT替换之前进行uint替换,它就可以工作了…可能使用正则表达式-
re
module@L3viathan将
INT8
更改为
PIN\u INT8
PIN\u UINT8
更改为
PIN\u UINT8
@furas-Ah,很好,我没想到。尝试
re.sub(r'(U?INT\d+?)',r'PIN\u1',line)