while循环多条件Python

时间:2011-08-24 01:06:09

标签: python loops while-loop conditional-statements

您好,我有以下功能:

def width(input,output,attr):
    import re
    input = input.strip()
    if re.search(attr, input):
        k = input.find(attr)
        for i in input:
            if i == attr[0]:
                j = k + len(attr)+1
                while ((j <= len(input)) |  (j != ' ') | (input[j+1] != "'")):
                    j = j + 1
                    #print j, output, input[j], len(input), k
                    output = output+input[j]
                break
            k = k + 1
    return output

print width('a=\'100px\'','','a')

我总是得到以下错误:

Traceback (most recent call last):
  File "table.py", line 45, in <module>
    print width(split_attributes(w,'','<table.*?>'),'','width')
  File "table.py", line 24, in width
    while ((j <= len(input)) |  (j != ' ') | (input[j+1] != "'")):
IndexError: string index out of range

我尝试使用or代替|,但它不起作用!

6 个答案:

答案 0 :(得分:1)

while ((j <= len(input)) |  (j != ' ') | (input[j+1] != "'")):

0)您应该使用or

1)你不应该使用input作为变量名;它隐藏了内置功能。<​​/ p>

2)j是一个整数,所以它永远不能等于' ',所以测试是没用的。

3)j <= len(input)j == len(input)时通过。字符串的长度是字符串的有效索引;索引为长度为N的字符串,范围从0到(N-1)(您也可以使用从-1到-N的负数,从末尾开始计数)。当然j+1也不起作用。

4)我不知道你到底想要做什么。你能用语言解释一下吗?如上所述,这不是一个非常好的问题;使代码停止抛出异常并不意味着它更接近于正常工作,当然并不意味着它更接近于成为好的代码。

答案 1 :(得分:0)

看起来j+1是一个大于或等于你所拥有的字符串长度的数字(input)。确保构造while循环,以便j < (len(input) - 1)始终为true,并且最终不会出现字符串索引超出范围错误。

答案 2 :(得分:0)

如果j >= len(input) - 1那么j+1肯定会超出范围。另外,请使用or而不是|

答案 3 :(得分:0)

您收到错误IndexError: string index out of range。唯一的索引引用是部分input[j+1]j = len(input)导致错误的情况,如下面的代码所示:

>>> input = "test string"
>>> len(input)
11
>>> input[11]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range
>>> input[10]
'g'

如果您尝试引用元素编号j+1,则需要满足条件j < ( len(input) - 1 )

答案 4 :(得分:0)

在if语句中使用!=时,请确保or实际上是您所需要的。这是一个例子:

import random
a = random.randint(1, 10)
b = random.randint(1, 10)
c = random.randint(1, 10)
if a != 1 or b != 1 or c != 1:
    print "None of the values should equal 1"
    # The interpreter sees `a != 1`.
    # If `a` is not equal to 1 the condition is true, and this code gets excecuted.
    # This if statement will return true if ANY of the values are not equal to 1.
if a != 1 and b != 1 and c != 1:
    print "None of the values are equal to 1" # True
    # This if statement will return true if ALL of the values are not equal to 1.

起初这是一件很难理解的事情(我一直都犯这个错误),但是如果你练习一下,那就很有意义了。

因此,为了让您的代码正常运行,请将这些|替换为and,它会起作用(并坚持使用关键字orand,除非您具体需要布尔或或和(| / &):

while ((j <= len(input)) and  (j != ' ') and (input[j+1] != "'")):

,输出为:

100px

答案 5 :(得分:0)

不是您问题的解决方案。可能符合您的目标的代码。

只需使用一个正则表达式:

import re

def width(input, attr):
    """
    >>> width("a='100px'", 'a')
    '100px'
    """
    regex = re.compile(attr + r""".*?'(?P<quoted_string>[^']+)'""")
    m = regex.match(input.strip())
    return m.group("quoted_string") if m else ''

if __name__ == '__main__':
    import doctest
    doctest.testmod()

此代码跳过attr并搜索后面带引号的字符串。 (?P<quoted_string>[^']+)捕获引用的字符串。 m.group("quoted_string")恢复引用的字符串。