Python regex - r префикс

Вы делаете это неправильно. Если вы наблюдаете, class имеет атрибут node enter failed, а не id. id имеет значение return_qtd_validate. Таким образом, ваш код будет:

for link in all_links: 
    wd.get(link) 
    errors = requests.get(link) 
    data = errors.text 
    pool = bs(data, 'lxml')
    for item in pool.findAll('g', attrs={'id' : 'return_qdt_validate'}): 
        all_errors.append(item.string)

РЕДАКТИРОВАТЬ:

Согласно вашему обновленному вопросу и комментариям, вам нужно найти статический атрибут, который соответствует всем ошибкам. В вашем примере я вижу, что атрибут class является статическим в случае обоих приведенных вами примеров ошибок. Так что этот код должен работать (просто замените id на class).

for link in all_links: 
    wd.get(link) 
    errors = requests.get(link) 
    data = errors.text 
    pool = bs(data, 'lxml')
    for item in pool.findAll('g', attrs={'class' : 'node enter failed'}): 
        all_errors.append(item.string)
69
задан MLavoie 19 December 2018 в 10:05
поделиться

4 ответа

Проверка ниже примера:

print r"123\n123" 
#outputs>>>
123\n123


print "123\n123"
#outputs>>>
123
123
0
ответ дан 24 November 2019 в 13:52
поделиться

Не все последовательности, включающие обратную косую черту, являются escape-последовательностями. Например, \ t и \ f , а \ s - нет. В необработанном строковом литерале любой \ , который не является частью escape-последовательности, рассматривается как просто еще один \ :

>>> "\s"
'\\s'
>>> "\t"
'\t'

\ b является Однако escape-последовательность, поэтому пример 3 не работает. (И да, некоторые люди считают такое поведение довольно неудачным.)

5
ответ дан 24 November 2019 в 13:52
поделиться

символ 'r' означает, что следующее является "необработанной строкой", т.е. символы обратной косой черты воспринимаются буквально, а не обозначают специальную обработку следующего символа.

http://docs.python.org/reference/lexical_analysis.html#literals

так '\n' - это одна новая строка
, а r'\n' - это два символа - обратная косая черта и буква 'n'
. '\\n', потому что первый обратный слеш экранирует второй

эквивалентный способ написать это

print (re.sub(r'(\b\w+)(\s+\1\b)+', r'\1', 'hello     there      there'))

-

print (re.sub('(\\b\\w+)(\\s+\\1\\b)+', '\\1', 'hello     there      there'))

Из-за того, как Python обращается с символами, которые не являются допустимыми управляющими символами, не все эти двойные обратные слеши необходимы - например, '\s'=='\\\s', однако то же самое не верно для '\b' и '\\\b'. Я предпочитаю быть явным и удваивать все обратные слеши.

32
ответ дан 24 November 2019 в 13:52
поделиться

Потому что \ начинают escape-последовательности только тогда, когда они являются допустимыми escape-последовательностями.

>>> '\n'
'\n'
>>> r'\n'
'\\n'
>>> print '\n'


>>> print r'\n'
\n
>>> '\s'
'\\s'
>>> r'\s'
'\\s'
>>> print '\s'
\s
>>> print r'\s'
\s

Если не присутствует префикс 'r' или 'R', escape-последовательности в строках интерпретируются в соответствии с правилами, аналогичными тем, которые используются в Стандарте C. Распознаваемые escape-последовательности:

 Escape Sequence Значение Примечания 
 \ newline Ignored 
 \\ Обратная косая черта (\) 
 \ 'Одиночная кавычка (') 
 \ "Двойные кавычки (") {{ 1}} \ a ASCII Bell (BEL) 
 \ b ASCII Backspace (BS) 
 \ f ASCII Formfeed (FF) 
 \ n ASCII Linefeed (LF) {{1} } \ N {name} Символ с именем name в базе данных Unicode (только Unicode) 
 \ r ASCII Carriage Return (CR) 
 \ t ASCII Horizontal Tab (TAB) 
 \ uxxxx Символ с 16-битным шестнадцатеричным значением xxxx (только Unicode) 
 \ Uxxxxxxxx Символ с 32-битным шестнадцатеричным значением xxxxxxxx (только Unicode) 
 \ v ASCII Vertical Tab (VT) 
 \ ooo Символ с восьмеричным значением ooo 
 \ xhh Символ с шестнадцатеричным значением hh 
 

Никогда не полагайтесь на необработанные строки для литералов пути, так как необработанные строки имеют довольно своеобразную внутреннюю работу , заведомо кусал людей в задницу:

Когда присутствует префикс «r» или «R», символ, следующий за обратной косой чертой, включается в строку без изменений, и все обратные косые черты остаются в строке. Например, строковый литерал r "\ n" состоит из двух символов: обратной косой черты и строчной буквы «n».Строковые кавычки можно экранировать обратной косой чертой, но обратная косая черта остается в строке; например, r "\" " является допустимым строковым литералом, состоящим из двух символов: обратной косой черты и двойной кавычки; r" \ " не является допустимым строковым литералом (даже необработанная строка не может заканчиваться нечетным числом обратных косых черт). В частности, необработанная строка не может заканчиваться одной обратной косой чертой (поскольку обратная косая черта экранирует следующий символ кавычки). Также обратите внимание, что одна обратная косая черта, за которой следует новая строка, интерпретируется как эти две как часть строки, а не как продолжение строки.

Чтобы лучше проиллюстрировать этот последний пункт:

>>> r'\'
SyntaxError: EOL while scanning string literal
>>> r'\''
"\\'"
>>> '\'
SyntaxError: EOL while scanning string literal
>>> '\''
"'"
>>> 
>>> r'\\'
'\\\\'
>>> '\\'
'\\'
>>> print r'\\'
\\
>>> print r'\'
SyntaxError: EOL while scanning string literal
>>> print '\\'
\
73
ответ дан 24 November 2019 в 13:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: