0

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

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

我想用不同的数字替换一些数字(第一个和第六个,“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出现在第一个(在其列中)等。所以list_a[2381] = 1list_b[1049] = 1

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

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

4

3 回答 3

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并使用正则表达式。我几乎可以保证的是,原始字符串中会有足够的空格让替换字符串适合那里(否则我必须更改原始文件中的对齐方式,这是一个不同的野兽)。

于 2012-12-17T14:59:22.587 回答
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)
于 2012-12-17T12:48:29.850 回答
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(其中 _ 是空格)

于 2012-12-17T12:58:21.617 回答