12

次の行を含む巨大なファイルがあり、 のDDD-1126N|refseq:NP_285726|uniprotkb:P00112DDD-1081N|uniprotkb:P12121の番号を取得したいuniprotkb

これが私のコードです:

x = 'uniprotkb:P'
f = open('m.txt')
for line in f:
  print line.find(x) 
  print line[36:31 + len(x)]

問題line.find(x)は 10 と 26 です。26 のときに完全な数を取得します。プログラミングは初めてなので、単語の後に完全な数を取得できるものを探しています。

x = 'uniprotkb:'
f = open('m.txt')
for line in f:
  if x in line:
    print the number after x
4

4 に答える 4

16

正規表現を使用します。

import re
for line in open('m.txt'):
    match = re.search('uniprotkb:P(\d+)', line)
    if match:
        print match.group(1)
于 2011-09-25T21:25:08.683 に答える
9
import re
regex = re.compile('uniprotkb:P([0-9]*)')
print regex.findall(string)
于 2011-09-25T21:22:39.430 に答える
4

静的であり、各行の終わりにある部分文字列と常に一致する場合(のように)、reモジュールはここではまったく不要です。 x"DDD-1126N|refseq:NP_285726|uniprotkb:P00112"

x = 'uniprotkb:'
f = open('m.txt')
for line in f:
  if x in line:
    print line[line.find(x)+len(x):]

編集: あなたのコメントに答えるために。それらがパイプ文字()で区切られている場合は、次の|ように実行できます。

sep = "|"
x = 'uniprotkb:'
f = open('m.txt')
for line in f:
  if x in line:
    matches = [l[l.find(x)+len(x):] for l in line.split(sep) if l[l.find(x)+len(x):]]
    print matches

m.txtに次の行がある場合:

DDD-1126N|uniprotkb:285726|uniprotkb:P00112

次に、上記が出力されます。

['285726', 'P00112']

sep = "|"列区切り文字を置き換えます。

于 2011-09-25T21:25:40.257 に答える
1

ええと、1つには、csvモジュールを使用してTSVファイルを読み取ることをお勧めします。

ただし、通常、正規表現を使用できます。

import re
regex = re.compile(r"(?<=\buniprotkb:)\w+")
for line in f:
    match = regex.search(line)
    if match: 
        print match.group()

正規表現の前に。が付いている場合、正規表現は英数字の文字列と一致しますuniprotkb:

于 2011-09-25T21:24:41.850 に答える