您好,我有以下功能:
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
代替|
,但它不起作用!
答案 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
,它会起作用(并坚持使用关键字or
和and
,除非您具体需要布尔或或和(|
/ &
):
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")
恢复引用的字符串。