在Python中查找文件中的重复文本

时间:2014-11-21 07:13:23

标签: python duplicates

我的文件包含如下文字:

# ER 1 - Text a
info sms ver=xxxxxxxx

# ER 2 - Text b
info call ver=xxxxxxxx

# ER 3 - Text c
info sms ver=yyyyyyyy

# ER 4 - Text d
info mms ver=xxxxxxxx

# ER 5 - Text e
info call ver=yyyyyyyy

我想通知用户“sms”& “call”存在于文件的多个位置。 输出应如下所示:

info sms exists in mutiple places of the file
info call exists in mutiple places of the file

我需要使用 info“text”ver = ... 搜索所有行,并查找文件的任何其他位置是否存在“text”,并在多个位置通知“text”该文件。

2 个答案:

答案 0 :(得分:0)

据推测,您正在将此文件解析为程序中某种有意义的数据结构。假设您最终得到一个名为info的对象,其中您关注的所有内容都作为属性存在 - 即,您可以执行以下操作:

print(info.sms)

打印出您已阅读的信息。

这意味着当您最初读取数据时,首先要确定要将其存储在哪个字段中,然后存储它。

所以,问题是,之前你填充该字段的对象的初始状态是什么?通常的选择是它根本没有那里的字段(你是通过第一次分配它来创建它),或者它有某种默认值(通常是None)。你可以很容易地检查这两种情况 - 在第一种情况下(可能更可能的情况),你做if hasattr(info, 'sms'):。在第二个中,您执行if info.sms is not None:。如果字段已经有值,那么这些检查将成功 - 这意味着您已经在此文件中读取了它的另一个值,并且它有多个条目。

所以,你的代码看起来像这样:

for line in file:
    # Work out what field we want to assign. Say its 'sms'
    if hasattr(info, 'sms'):
        print('info sms exists in multiple places of the file')
    info.sms = parse_value(line) # Or however you parse it

答案 1 :(得分:0)

我会选择正则表达式:

import re
text="# ER 1 - Text a\ninfo sms ver=xxxxxxxx\n\n# ER 2 - Text b\ninfo call ver=xxxxxxxx\n\n# ER 3 - Text c\ninfo sms ver=yyyyyyyy\n\n# ER 4 - Text d\ninfo mms ver=xxxxxxxx\n\n# ER 5 - Text e\ninfo call ver=yyyyyyyy"
match1="info (.*) [^info]*"

print re.findall(match1,text) # -> ['sms', 'call', 'sms', 'mms', 'call']

您可以自己弄清楚如何计算它们。