1

0/1Python で正規表現を使用して、大きなタブ区切りのテキスト ファイルを 1 行ずつ解析し、または行に 5 つ以上のインスタンスが含まれる行を出力しようとしています1/1

私のスクリプトはほとんどそこにありますが、5 つ以上のインスタンスに苦労しています。

これにより、1 つの一致で行が出力されます。

import re  
f = open ("infile.txt", "r")  
out = open("outfile.txt", "w")  

for line in f:  
    if re.match(r"(.*)(0|1)/(1)(.*)", line):  
        print >> out, line,

5つ以上の一致がある行のみを印刷するには、次のように試しfindallましfinditerたが、機能しませんでした:

for line in f:  
    x = len(re.findall(r"(.*)(0|1)/(1)(.*)", line)):  
    if x > 5:  
        print >> out, line,

誰でもこれで私を助けることができますか?

テキスト ファイルの 1 行の例を次に示します (ファイル内のすべてのスペースはタブです)。

X 6529 . C A,G PASS AC=4,2;AF=0.6777 1/1:0,20 0/1:0,16 0/1:0,16 0/0:4,16 0/0:3,1 
4

2 に答える 2

1

{5,} を使用して、パターンに 5 回以上一致させることができます

import re
f = open ("data.txt", "r")
out = open("dataout.txt", "w")

for line in f:
    if re.match(r"(.*([01]/1.*){5,}", line):
        print >> out, line,
于 2013-04-06T00:56:42.063 に答える
0

うまくいく解決策は2つあると思います。最初のものは、 orfindallの 1 回の出現に一致するパターンでa を実行するという現在の考えに固執します。2 つ目は、そのテキストに一度に 5 回一致する単一のパターンを作成することです。0/11/1

最初のアプローチについては、現在のパターンの一部を削除するだけでよいと思います.astericssymbol(なぜ.*. 動作するはずのコードは次のとおりです。

for line in f:
    matches = re.findall(r'[01]/1', line)
    if len(matches) >= 5:
        print >> out, line,

必要のないキャプチャ グループを削除しましたが、処理が少し遅くなる可能性があります。

2 番目の方法では、 を 1 回呼び出すだけで、適切な並べ替えの一致が 5 つ見つかった場合にのみre.search非値が返されます。Noneこのパターンは、繰り返し構文 を使用して、前のパターンの正確なコピー{N}を見つけます。Nこの場合、0/1または1/1ビットの間の余分な文字を一致させる必要があるため、パターンに が.*追加されます。全体を繰り返したいので、非キャプチャ グループでラップする必要があります。

for line in f:
    if re.search(r'(:?[01]/1.*){5}', line):
        print >> out, line,
于 2013-04-06T00:57:07.803 に答える