我试图通过使用两个单词的索引(起始位置和结束位置)而不是单词来确定两个单词是否在字符串中重叠。
例如:
str = "testme"
start_word_1 = 0
end_word_1 = 4
start_word_2 = 4
end_word_2 = 6在这个示例中,str0:4是"test“,而str4:6是"me”。这些都不重叠,但是单词1的结尾和单词2的开头是一样的,所以这些都没问题。我只是觉得我把它弄得太复杂了,还有更简单的代码来涵盖完全重叠的单词和只部分重叠的单词。谢谢!
为了澄清重叠:我的意思是在字符串切片中,str、0:4和str4:6不重叠。他们都没事。
但str0:5确实与str4:6重叠。
另外,str0:6确实与str1:4重叠,这里的"est“完全位于”testme“的内部。
这将用于文本突出显示,我不希望任何东西是冲突的突出显示。
发布于 2015-11-06 21:31:21
我认为这样的事情很简单,并且满足了你(诚然有点奇怪)的要求。注意,这是使用类似于切片的字符串,与索引的使用相对应,而不是使用单词本身:
In [1]: def words_overlap(slice1, slice2):
...: """Take two strings representing slices (e.g. 'x:y') and
...: return a boolean indicating whether they overlap"""
...: if slice1[0] < slice2[0]: # slice1 is leftmost
...: return slice2[0] < slice1[2] # slice2 ends before slice1 starts
...: else:
...: return slice1[0] < slice2[2]
...:
In [2]: words_overlap('1:3', '2:4')
Out[2]: True
In [3]: words_overlap('2:4', '1:3')
Out[3]: True
In [4]: words_overlap('2:3', '5:7')
Out[4]: False
In [5]: words_overlap('0:4', '4:6')
Out[5]: False它所做的就是使用一个简单的小于测试的方法来检测哪个切片是最左边的,然后告诉您最右边的切片是否在最左边的一个结束之前启动。
应该是相当有效的,因为它只涉及两个整数比较。
发布于 2015-11-06 21:08:59
也许是那样?
start1 < end2 and start2 < end1这意味着:这两个单词的开头早于另一个单词的结尾,因此它们是重叠的。
发布于 2015-11-06 21:18:09
Case 1:Word 2是单词1的子字符串(或匹配)(反之亦然)
word1 in word2 or word2 in word1例如。"StackExchange“和"tack”
案例2:Word 2在单词1的末尾重叠
for i in range(1, len(word2)): word1.endswith(word2[:-i])
例如。“堆叠溢出”与“流动”
案例3:Word 2在单词1的开头重叠
for i in range(1, len(word2)): word1.startswith(word2[i:])
例如。“徽章”和“非常糟糕”
https://stackoverflow.com/questions/33575620
复制相似问题