替换字符串中不同长度的数字

时间:2012-12-17 12:46:13

标签: python

我在文件中有这样的字符串:

  2381         OH    209    SER     OG   1049    -0.6546         16   ; qtot 1.543

我希望用不同的数字替换一些数字(第1和第6,“2381”和“1049”),但保持对齐,即根据需要在数字之前添加或删除空格。也就是说,我会将2381替换为__24_为空白)或_1049替换37628

我可以对每个数字的确切位置进行硬编码,但是对于不同的文件,这些可能会有所不同。我想要更多样化的东西。

任何人都可以帮我在python中这样做吗?说代码是这样的:

# list_a and list_b contain two different mappings between integer numbers
for line in file:
  (a, b) = (int(line.split()[0]), int(line.split()[5]))
  c = list_a[a]
  d = list_b[b]
  # create "modline", as "line" where (a,b) are replaced with (c,d)
  print modline

如果重要,映射list_alist_b只是数字ab的出现顺序。所以,如果输入文件有:

  2381         OH    209    SER     OG   1049    -0.6546         16   ; qtot 1.543
  2382         HO    209    SER     HG   1049     0.4275      1.008   ; qtot 1.971
  2379          C    209    SER      C   1048     0.5973      12.01   ; qtot 2.568
  2380          O    209    SER      O   1048    -0.5679         16   ; qtot 2

我希望它成为:

     1         OH    209    SER     OG      1    -0.6546         16   ; qtot 1.543
     2         HO    209    SER     HG      1     0.4275      1.008   ; qtot 1.971
     3          C    209    SER      C      2     0.5973      12.01   ; qtot 2.568
     4          O    209    SER      O      2    -0.5679         16   ; qtot 2

因为2381出现在第1位,2380出现在第4位; 1049出现在第1位(在其列中),等等list_a[2381] = 1list_b[1049] = 1

但是我想我知道怎么做,我现在的问题实际上是在替换字符串中的数字,同时考虑到可变数量的空格。

我应该补充说,不能保证每行中的数字都是唯一的,所以我不能简单地依赖正则表达式匹配。我必须替换第1和第6个数字,而不是“2381”的每个(或第一个)实例

3 个答案:

答案 0 :(得分:1)

回答我自己的问题,我认为这样做:

# list_a and list_b contain two different mappings between integer numbers
for line in file:
  words = re.findall("(\s*\S+)", line)
  a = int(words[0])
  b = int(words[5])
  c = list_a[a]
  d = list_b[b]
  modline = str(c).rjust(len(words[0])) + "".join(words[1:5]) + str(d).rjust(len(words[5])) + "".join(words[6:])
  print modline

也就是说,忘掉简单的split并从头开始去正则表达式。我几乎可以保证的是,原始字符串中将有足够的空格来替换字符串以适应那里(否则我必须更改原始文件中的对齐方式,这是一个不同的野兽)。

答案 1 :(得分:0)

如下所示:

yourstring.replace(' 2381 ','   24 ')

以下是我会这样做的(我认为):

def same_space_replace(s,fld,rep):
    fld = fld.rjust(len(rep))      #could use `.ljust` or `.center` as well.
    rep = rep.rjust(len(fld))
    return s.replace(fld,rep)

for line in file:
    split_line = line.split()
    a = split_line[0]
    rep_a = str(list_a[int(a)])

    b = split_line[1]
    rep_b = str(list_b[int(b)])

    modline = same_space_replace(line,a,rep_a)
    modline = same_space_replace(line,b,rep_b)

答案 2 :(得分:0)

动态地做这样的事情:

# example with a being 2381 and b being 1049

modeline = line.replace(a, list_a[a].rjust(len(a), ' ')).replace(b, list_b[b].rjust(len(b), ' ')

因此,这使用与旧版本相同数量的空格来对新数字进行右对齐以保持空白,因此2381将转换为__24(_为空格)