我试图找出一个子串(“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个实例,它在第一个和第三个实例中找到句点,但不是第二个,我不明白为什么它会跳过那个。
答案 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)