0

这是 Python 的一个练习,我对 Python 中的变量范围感到困惑。

“如果给定的字符串包含“xyz”的外观,其中 xyz 没有直接以句点 (.) 开头,则返回 True。所以“xxyz”很重要,但“x.xyz”没有。

xyz_there('abcxyz') → 真
xyz_there('abc.xyz')→ 假 xyz_there('xyz.abc') → 真"

这是我的回答:

def xyz_there(str):
   for i in range(len(str)-2):
        if str[i]=='.':
           i+=1
           continue
        elif str[i:i+3]=='xyz':
           return True
   return False

这是错误的。xyz_there('abc.xyz') → False总会回来True的。因为变量i将始终为 0,1,2.... 而i+=1并不意味着什么。为什么???

4

3 回答 3

4

并不是说你不能改变i. 你可以。这里的诀窍是您正在迭代range. 每次循环重置时,您都会从该可迭代中获取下一个值,它不会增加 的值i来进行循环。

于 2012-08-10T03:04:56.660 回答
1

您是否需要使用 for 循环?这将是一个正则表达式的好地方。我已经修改了下面的示例,所以我不只是给你答案......我不是在寻找“xyz”,而是在寻找“你好”。而且我还试图避免看到“?” 在那个“你好”之前。

import re
def hello_there(str):
    if re.match("(.*[^\?])?hello.*", str):
        return True
    return False

正则表达式模式包括:

  • .*- 字符串开头的任意数量的非换行符;
  • [^\?]- 在后面的所有内容之前不允许^有一个(n 转义的)问号;\?
  • hello- 确保hello会出现;
  • .*- 并以任意数量的其他字符结尾。

re.match 将返回一个解析为布尔值 True 的 MatchObject,因此它可以用作 if 语句中的条件。

>>> hello_there("foohellobar")
True
>>> hello_there("foo?hellobar")
False
>>> hello_there("foohello?bar")
True
于 2012-08-10T04:10:47.097 回答
0

最简单的答案是:

def xyz_there(str):
    for i in range(len(str)-2):
        if str[i:i+3] == "xyz" and str[i-1] != ".":
            return True
    return False 
于 2021-01-14T04:05:44.110 回答