Python 仅在特定位置用整数替换整数

Python replace integers by integers only at particular location

您好,我有一个文件,其中包含如下所示的数据。我想用字典中的其他整数(键,值)替换 'A'(第四列)2,3,15,25,115,1215 之后出现的整数。 'A' 后的空格数范围为 0-3。我在 python 中尝试了 str.replace(old,new) 方法,但它替换了文件中整数的所有实例。
这是我想在文件中进行的替换。

replacements = {2:0,3:5,15:7,25:30,115:120,1215:1220}

Name      1  N   ASHA A   2 35 23    
Name      2  R   MONA A   3 25 56    
Name      3  P   TERY A  15 23 32    
Name      4  Q   JACK A  25 56 25   
Name      5  D   TOM  A 115 57 45  
Name      3  P   SEN  A1215 45 56  

给我一些建议。

Regex101

^[\w\d\s]{23}([\d\s]{1,4}).*$

Debuggex Demo

注:这里更多的是定长解析


Python

import re

replacements = {2:0,3:5,15:7,25:30,115:120,1215:1220}
searchString = "Name      1  N   ASHA A   2 35 23    "

replace_search = re.search('^[\w\d\s]{23}([\d\s]{1,4}).*$', searchString, re.IGNORECASE)

if replace_search:
    result = replace_search.group(1)

convert_result = int(result)
dictionary_lookup = int(replacements[convert_result])
replace_result = '% 4d' % dictionary_lookup
regex_replace = r"\g<1>" + replace_result + r"\g<3>"

line = re.sub(r"^([\w\d\s]{23})([\d\s]{1,4})(.*)$", regex_replace, searchString)

print(line)
replacements = {2:0,3:5,15:7,25:30,115:120,1215:1220}

s="""Name      1  N   ASHA A   2 35 23
Name      2  R   MONA A   3 25 56
Name      3  P   TERY A  15 23 32
Name      4  Q   JACK A  25 56 25
Name      5  D   TOM  A 115 57 45
Name      3  P   SEN  A1215 45 56"""
res = []
for line in s.splitlines():
    spl = line.split()
    if len(spl) == 8:
        ints = map(int,spl[-3:])
        res.append(" ".join(spl[:-3]+[str(replacements.get(k, str(k))) for k in ints]))
    else:
        spl[-3] = spl[-3].replace("A","")
        ints = map(int,spl[-3:])
        res.append(" ".join(spl[:-3]+["A"]+[str(replacements.get(k, str(k))) for k in ints]))

print(res)

['Name 1 N ASHA A 0 35 23', 'Name 2 R MONA A 5 30 56', 'Name 3 P TERY A 7 23 32', 'Name 4 Q JACK A 30 56 30', 'Name 5 D TOM A 120 57 45', 'Name 3 P SEN A 1220 45 56']

不确定你是想使用数据还是将其写入文件,但如果你的文件像你的示例,这将替换字典中的数字,如果 split 的 len 不同,我们知道我们有一个数字和 A 没有 space 所以我们替换 . 总会有一个 space,所以如果您写入文件并且必须再次处理该文件,它会容易得多。

除非您真的想要整数,否则我只会删除映射并使用字符串作为键和值。 如果您想保持完全相同的格式并且只想更改第一个数字:

replacements = {"2":"0","3":"5","15":"7","25":"30","115":"120","1215":"1220"}

s="""Name      1  N   ASHA A   2 35 23
Name      2  R   MONA A   3 25 56
Name      3  P   TERY A  15 23 32
Name      4  Q   JACK A  25 56 25
Name      5  D   TOM  A 115 57 45
Name      3  P   SEN  A1215 45 56"""
res = []
for line in s.splitlines():
    spl = line.rsplit(None, 3)
    end = spl[-3:]
    if "A" == end[0][0]:
        k = end[0][1:]
        res.append(line.replace(k,replacements.get(k,k)))
    else:
        k = end[0]
        res.append(line.replace(k,replacements.get(k,k)))

print(res)

['Name      1  N   ASHA A   0 35 03', 'Name      2  R   MONA A   5 25 56', 'Name      3  P   TERY A  7 23 32', 'Name      4  Q   JACK A  30 56 30', 'Name      5  D   TOM  A 120 57 45', 'Name      3  P   SEN  A1220 45 56']

根据有关所有其他号码的附加信息进行编辑。

这完全取决于您在评论中提到的文件的具体特征。

replacements = {2:0,3:5,15:7,25:30,115:120,1215:1220}

with open('input.txt', 'r') as fin, open('output.txt', 'w') as fout:
    pos_a = 22 # 0-indexed position of 'A' in every line
    for line in fin:
        left_side = line[:pos_a + 1]
        num_to_convert = line[pos_a + 1: pos_a + 5]
        right_side = line[pos_a + 5:]

        # String formatting to preserve padding as per original file
        newline = '{}{:>4}{}'.format(left_side, 
                                        replacements[int(num_to_convert)],
                                        right_side)
        fout.write(newline)

如果列中的某个值可能不在您的 replacements dict 中,并且您希望保持该值不变,则不要使用 replacements[int(num1)],而是执行 replacements.get(int(num1), num1)