цикл цикла несколько условий Python - PullRequest
0 голосов
/ 24 августа 2011

Здравствуйте, у меня есть следующая функция:

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 ]

1 голос
/ 24 августа 2011
while ((j <= len(input)) |  (j != ' ') | (input[j+1] != "'")):

0) Вы должны использовать or.

1) Вы не должны использовать input в качестве имени переменной;он скрывает встроенную функцию.

2) j - целое число, поэтому оно никогда не может быть равно ' ', поэтому проверка бесполезна.

3) j <= len(input) проходит, когда j == len(input).Длина строки не допустимый индекс в строке;индексы в строку длиной N варьируются от 0 до (N - 1) (вы также можете использовать отрицательные числа от -1 до -N, чтобы считать с конца).Конечно, j+1 тоже не работает.

4) Я не могу сказать, какого чёрта вы на самом деле пытаетесь сделать.Не могли бы вы объяснить это словами?Как уже говорилось, это не очень хороший вопрос;прекращение создания исключений в коде не означает, что он ближе к правильной работе, и, конечно, не означает, что он ближе к хорошему коду.

0 голосов
/ 24 августа 2011

Не решение вашей проблемы.Код, который, вероятно, делает то, к чему вы стремитесь.

Просто используйте одно регулярное выражение:

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") восстанавливает строку в кавычках.

0 голосов
/ 24 августа 2011

При использовании != в операторах 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.

Поначалу это трудно понять (я постоянно совершал эту ошибку), но если вы немного попрактикуетесь, это будет иметь смысл.

Итак, чтобы ваш код заработал, замените эти | s на and, и он будет работать (и придерживайтесь ключевых слов or и and, если только вам конкретно не нужен логический или или или и (| / &):

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

и вывод:

100px
0 голосов
/ 24 августа 2011

Вы получаете ошибку 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 ) должно быть выполнено.

0 голосов
/ 24 августа 2011

если j >= len(input) - 1, то j+1 наверняка выйдет за пределы. Также используйте or, а не |.

0 голосов
/ 24 августа 2011

Похоже, j+1 - это число, которое больше или равно длине имеющейся у вас строки (input). Убедитесь, что ваш цикл while структурирован так, что j < (len(input) - 1) всегда имеет значение true, и вы не получите строковый индекс вне ошибки диапазона.

...