Python - 合并两个重叠的字符串

时间:2015-12-10 10:19:30

标签: python

我正在尝试创建一个完整的地址,但我得到的数据是:

Line 1                     | Line 2                   | Postcode
1, First Street, City, X13
1, First Street             First Street, City          X13 
1                           1, First Street, City, X13  X13

还有一些关于如何创建这些数据的其他排列,但我希望能够将所有这些合并到一个没有重叠的字符串中。所以我想创建字符串:
1, First Street, City, X13

但不是1, First Street, First Street, City, X13等。

如何在不复制数据的情况下连接或合并这些?在顶线上还有一些单元格,其中没有信息通过第一个单元格。

2 个答案:

答案 0 :(得分:2)

如果您有纯文本,则可以使用\n拆分文字以获取该行,并使用,拆分行以获取单独的字段:

>>> s = """1, First Street, City, X13
... 1, First Street             First Street, City,          X13 
... 1                           1, First Street, City, X13  X13"""
>>> 
>>> lines = s.split('\n')
>>> 
>>> splitted_lines = [line.split(',') for line in lines]

注意通过将逗号csv指定为分隔符,您可以使用,模块来阅读文本,这是一种更加pythonic的方法。

import csv
with open('file_name') as f:
    splitted_lines = csv.reader(f,delimiter=',') 

然后,您可以使用以下列表推导来获取每列中的唯一字段:

>>> import re
>>> ' '.join([set([set(re.split(r'\s{2,}',i)).pop() for i in column]).pop() for column in zip(*splitted_lines)])
'1  First Street  City'

请注意,您可以在此处使用zip()功能获取列,然后将re.split()项与正则表达式r'\s{2,}'分开,将字符串拆分为2个或更多空格,然后可以起诉set()以保留唯一的项目。

注意:如果您关心订单,可以使用collections.OrderedDict代替set

>>> from collections import OrderedDict
>>> 
>>> d = OrderedDict()
>>> ' '.join([d.fromkeys([set(re.split('\s{2,}',i)).pop() for i in column]).keys()[0] for column in zip(*splitted_lines)])
'1  First Street  City  X13'

答案 1 :(得分:2)

如果你不介意丢失标点符号:

from collections import OrderedDict
od = OrderedDict()


from string import punctuation
with open("test.txt") as f:
    next(f)
    print("".join(od.fromkeys(word.strip(punctuation) for line in f    
          for word in line.split())))

1 First Street City X13

如果您有重复的单词,您将无法使用该方法,但根据您的输入,无法知道可能的组合是什么,第二条线实际上始终完好无损,在这种情况下,您将只是需要拉第二行。