查找char是否在substring之前

时间:2016-03-02 16:45:18

标签: python string substring

我试图找出一个子串(“xyz”)是否在一个字符串中,如果是,如果它有“。”在其左侧的索引中。如果子字符串具有它之前的句点,则不计算它,如果子字符串出现而没有句点,则返回true。

我首先检查子字符串是否在字符串中,如果出现则追加子字符串的索引。然后我遍历该列表并检查index-1是否为“。”,如果是,则删除索引。然后,如果列表中仍有任何内容,我会返回True,因为条件会得到满足。

我无法导入任何模块,因为这是比赛的一部分,所以没有正则表达式。

这是我到目前为止所做的:

    def xyz_there(a_str):
        #Finds all indexes that xyz starts at
        indexes=[i for i in range(len(a_str)) if a_str.startswith("xyz", i)]

        #Check if sub not in string or string too short
        if len(a_str)<3 or "xyz" not in a_str:
            return False

        #Iterate through indexes, check for preceding "."
        for i in indexes:
            if a_str[i-1] == ".":
                indexes.remove(i)
            if len(indexes)>0:
                return True
            else:
                return False

它在大多数情况下运行良好,但使用此测试时存在问题:

xyz_there('1.xyz.xyz2.xyz')  #Should return False

给定子串的3个实例,它在第一个和第三个实例中找到句点,但不是第二个,我不明白为什么它会跳过那个。

4 个答案:

答案 0 :(得分:4)

如何使用count

def xyz_there(s):
    return s.count('xyz') - s.count('.xyz') > 0

示例用法:

xyz_there('1.xyz.xyz2.xyz')
xyz_there('1.xyz.xyz2xyz')

输出:

False
True

答案 1 :(得分:1)

您的第一个问题是您使用indexes.remove(i)indexes.remove(i)移除了i中第一次出现的indexes。它不会删除该位置的元素。要做你想做的事,你需要使用indexes.pop(i)。此外,在完成之前,您正在检查indexes的长度。你需要超越这些界限:

for i in indexes:
    if a_str[i-1] == ".":
        indexes.pop(i)

if len(indexes)>0:
    return True
else:
    return False

您可以将这些if - else行替换为return len(indexes) > 0

答案 2 :(得分:0)

如果你想使用列表压缩,你可以使用过滤器来实现一线解决方案:

def xyz_there(a_str):
    return a_str[:3] == 'xyz' or any([not a_str[i-1] == '.' and a_str[i:i+3] == 'xyz' for i in range(1,len(a_str)-2)])

答案 3 :(得分:0)

import re
def xyz_there(a_str):
   all_indexes = re.finditer("xyz", a_str)
   with_dot_preceding = [[n.start(), n.end()] for n in all_indexes if a_str[n.start() - 1] == "."]
return with_dot_preceding

test = xyz_there(".xyz.xyz")
if(len(test) > 0):
    print True 
    print "True in %d places" % len(test)