0

私はファイルにこのような文字列を持っています:

  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は数字の出現順序aですb。したがって、入力ファイルに次のものがある場合:

  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

23811番目に表示されるため、 23804番目に表示されます。1049(その列に)1番目に表示されlist_a[2381] = 1ますlist_b[1049] = 1

しかし、私はそれを行う方法を知っていると思います。私の問題は、スペースの可変数を考慮して、文字列内の数字を実際に置き換えることです。

番号が各行で一意であるという保証はないので、正規表現の一致に単純に依存することはできません。「すべての(または最初の)インスタンス」ではなく、1番目と6番目の番号を置き換える必要があり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 に答える