当有额外的字符时,在Python列表中匹配

时间:2013-01-22 22:34:23

标签: python sorting matching

我正在尝试编写一个python代码来匹配python中两个列表中的内容。

一个制表符分隔文件如下所示:

COPB2

KLMND7

BLCA8

而另一个file2有一长串相似的“名字”,如果你愿意的话。文件中应该有一些相同的匹配,我已成功识别并写入新文件。问题是当其中一个“名称”的末尾有其他字符时。例如,上面的COPB2应与file2中的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

3 个答案:

答案 0 :(得分: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

大文件可能很慢。如果这是不可接受的,我可以尝试考虑如何优化它。

答案 1 :(得分:0)

如果您需要更通用的解决方案,可以查看difflib。请记住,这是一个很大的进口,有很多开销,所以只有在你真的需要时才使用它。这是另一个有点相似的问题。

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

答案 2 :(得分: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