【问题标题】:Find if char precedes substring查找 char 是否在子字符串之前
【发布时间】:2016-03-02 16:45:17
【问题描述】:

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

【问题讨论】:

  • 正则表达式是内置功能

标签: python string substring


【解决方案1】:

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

【讨论】:

  • return s.count('xyz') - s.count('.xyz') &gt; 0 也可以。
  • @MartinEvans 更好,如果你不介意我可以用你的更正更新我的答案
  • 如果有人知道我的代码哪里出错了,我很想知道以供将来参考。
【解决方案2】:

您的第一个问题是您使用indexes.remove(i)indexes.remove(i) 删除 iindexes 中的第一次出现。它不会删除该位置的元素。要做你想做的事,你需要使用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) &gt; 0

【讨论】:

  • 我这样做了,但它返回了同样的问题。
  • 哦,好吧,我不知道那个邻接 remove()。这样就搞定了,谢谢。
【解决方案3】:

如果你想使用列表压缩的单行解决方案,你也可以使用过滤器:

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

【讨论】:

    【解决方案4】:
    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-04
      • 2012-02-10
      • 1970-01-01
      • 2021-07-27
      • 2016-01-20
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多