在字符串中查找不同单词的位置而不重叠

时间:2017-03-05 20:07:25

标签: python python-2.7 list dictionary

我正在尝试在文本字符串中搜索某些单词/字符串,并将其位置放入字典中。

一个例子可以更好地解释我想要完成的事情以及我的问题。

content = """Learning python is something I always wanted to do. The fact that python is a simple and intuitive language made me feel bad for learning other programming languages in the first place. I think the main reason why I didn't choose the python language was the fact that I didn't do a proper research about the pros and cons of the available programming options. I gues that writing this paragraph about learning the python language it's harder than the python script I'm trying to accomplish. No, I'm just kidding, if this was the case then I would have completed writing the python languaguage and didn't bother you guys anymore."""

mylist = ['python', 'dummy keyword', 'python language', 'learning the python language', 'another keyword']

dictKw = {}
for x in mylist:
    x = x.lower()
    listKw = []
    for m in re.finditer(x, contentLower):
        #print (x  , " found " , m.start(), m.end())
        listKwPos = []
        listKwPos = [m.start(), m.end()]
        listKw.append(listKwPos)
        dictKw [x] = listKw

print dictKw

所以我在这里搜索内容字符串,找到 mylist 中找到的每个关键字,并将每次出现的开始和结束位置存储到字典中关键字为关键字和关键字位置列表。

打印 dictKw 我得到:

{'python': [[9, 15], [66, 72], [234, 240], [414, 420], [451, 457], [574, 580]], 'learning the python language': [[401, 429]], 'python language': [[234, 249], [414, 429]]}

首先,我认为字典中的键顺序是错误的 - python,学习python语言,python语言而不是 python,python语言,学习python语言。我看到,当附加 listKw 列表时,它会在 python python语言之间放置学习python语言键把它放在最后。

我认为正确的结果应该是:

{'python': [[9, 15], [66, 72], [234, 240], [414, 420], [451, 457], [574, 580]], 'python language': [[234, 249], [414, 429]], 'learning the python language': [[401, 429]]}

现在,我想删除相互重叠的关键字的列表元素,保持 mylist

中第一个关键字的初始优先级

在我们的示例中 python 重叠 python语言所以第一次发生这种情况时, python语言应该丢失第一个位置列表所以结果将是:

{'python': [[9, 15], [66, 72], [234, 240], [414, 420], [451, 457], [574, 580]], 'python language': [[414, 429]],'learning the python language': [[401, 429]]}

当检查剩余的重叠时,优先级应该改变,因此python将丢失重叠列表元素,因此结果将是:

{'python': [[9, 15], [66, 72], [234, 240], [451, 457], [574, 580]], 'python language': [[414, 429]],'learning the python language': [[401, 429]]}

等等。因此,如果我们遇到第三次重叠,优先级应该再次切换到 python ,因此 python语言会丢失开始/结束元素列表。

完成此检查后, python语言学习python语言重叠检查应该跟随导致删除学习python语言的列表值字典键。

最终结果应为:

{'python': [[9, 15], [66, 72], [234, 240], [451, 457], [574, 580]], 'python language': [[414, 429]],'learning the python language': [[]]}

现在对于这个重叠的问题部分,我不知道从哪里开始所以我请求你的帮助指出我正确的方向或者可能为我想要完成的事情提供另一种方法。

请注意, mylist 元素可以包含任何其他订单,元素的顺序决定了关键字优先级 - 最重要的是优先级。

1 个答案:

答案 0 :(得分:0)

请注意,在python中,词典{"a": 1; "b": 2; "c": 3}{"b":2 ; "a" : 1; "c": 3}是等效的 - 默认情况下,键是完全无序的。要解决此问题,您可以使用OrderedDict,它会按订单键/值对的顺序排列字典元素。