1

Python で 2 つのリストの内容を一致させるための Python コードを作成しようとしています。

1 つのタブ区切りファイルは次のようになります。

COPB2

KLMND7

BLCA8

一方、他の file2 には、似たような「名前」の長いリストがあります。ファイルには同一の一致がいくつかあるはずですが、それを特定して新しいファイルに書き出すことに成功しました。問題は、「名前」の 1 つの末尾に追加の文字がある場合です。たとえば、COPB2上記のファイル 2 では一致COPB2Aするはずですが、一致しません。同様に、KLMND7と一致する必要がありKLMND79ます。正規表現を使用する必要がありますか? それらを文字列にしますか?どんなアイデアも役に立ちます、ありがとう!

以下に示す最初の応答の後、私がこれまでに取り組んできたこと:

with open(in_file1, "r") as names:
for line in names:
    file1_list = [i.strip() for i in line.split()]
    file1_str = str(file1_list)

with open(in_file2, "r") as symbols:
for line in symbols:
    items = line.split("\t")
    items = str(items)
    matches = items.startswith(file1_str)
    print matches

このコードはFalse、いくつか一致するはずであることがわかっている場合に返されます。

4

3 に答える 3

2

string.startswith()末尾の文字のみの場合、正規表現は必要ありません

>>> g = "COPB2A"
>>> f = "COPB2"
>>> g.startswith(f)
True

これが実際のコードです:

file1_list = []
with open(in_file1, "r") as names:
    for line in names:
        line_items = line.split()
        for item in line_items:
            file1_list.append(item)

matches = []
with open(in_file2, "r") as symbols:
    for line in symbols:
        file2_items = line.split()
        for file2_item in file2_items:
            for file1_item in file1_list:
                if file2_item.startswith(file1_item):
                    matches.append(file2_item)
                    print file2_item
print matches

大きなファイルの場合、かなり遅くなる場合があります。受け入れられない場合は、最適化する方法を考えてみることができます。

于 2013-01-22T22:36:37.523 に答える
0

より一般的な解決策が必要な場合は、difflib を参照してください。大量のオーバーヘッドを伴う大きなインポートであるため、本当に必要な場合にのみ使用してください。これは、やや似ている別の質問です。

https://stackoverflow.com/questions/1209800/difference-between-two-strings-in-python-php

于 2013-01-22T22:48:00.913 に答える
0

ファイルをリスト X、Y にロードしたと仮定します。

## match if a or b is equal to or substring of one another in a case-sensitive way
def Match( a, b):
    return a.find(b[0:min(len(a),len(b))-1])

common_words = {};
for a in X:
    common_words[a]=[];
    for b in Y:
        if ( Match( a, b ) ):
             common_words[a].append(b);

正規表現を使用してマッチングを行う場合は、「単語一致の開始」演算子「^」を使用します。

import re
def MatchRe( a, b ):        
    # make sure longer string is in 'a'.
    if ( len(a) < len(b) ):
         a, b = b, a;
    exp = "^"+b;
    q = re.match(exp,a);
    if ( not q ):
       return False; #no match
    return True; #access q.group(0) for matches
于 2013-01-22T22:55:05.627 に答える