2016-03-02 64 views
2

我试图找出一个子字符串(“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分的情况下,它会在第一个和第三个实例中找到这个时间段,但不是第二个时间段,我不明白为什么它会跳过那个。

+2

正则表达式是一个内置功能 – tinySandy

回答

4

else线:

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 
+2

'return s.count('xyz') - s.count('。xyz')> 0'也可以。 –

+0

完美,谢谢。 – JonnyDoeInWisco

+0

@MartinEvans它更好,如果你不介意我可以更新我的答案与您的更正 – tinySandy

1

您的第一个问题是您使用indexes.remove(i)indexes.remove(i)删除indexes中的第一个出现i。它不会删除该位置的元素。要做你想做的事,你需要使用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 - 关于使用count什么用return len(indexes) > 0

+0

我做到这一点,它的返回一样的问题。 – JonnyDoeInWisco

+0

我刚刚发现你的问题。看我的编辑。 – zondo

+0

噢好吧,我不知道那个邻居删除()。这清除了一切,谢谢。 – JonnyDoeInWisco

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)]) 
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)