Фильтрация списка по регулярному выражению в python не работает с одинарными кавычками - PullRequest
0 голосов
/ 19 апреля 2020

Я извлекаю данные со страницы html с помощью xpath и хочу получить указанную c информацию, расположенную в текстовой части.

>>> response.xpath('//*[@id="productDetails"]/div[1]/div[2]/div[2]/text()').extract()
['\nInhalt: 10 Stück', '\nGrundpreis: 1 Stück 0,14 €']

Это возвращает мне требуемую информацию в словаре, наряду с несколькими другими данными.

Теперь я пытаюсь получить нужную информацию с помощью регулярных выражений, так как я не знаю позицию, она меняется. Поэтому я фильтрую:

>>> r = re.compile('.*Grundpreis.*')
>>> newlist = list(filter(r.match, data))

Как-то это не работает и возвращает пустой список:

>>> newlist
[]

Я следовал примерам, найденным на SO, который работал, но этот нет. Единственное отличие, которое я смог найти, это то, что мой пример - одинарные кавычки вместо двойных. Но кажется, что это невозможно изменить с помощью команды xpath.

Как извлечь нужную информацию "Grundpreis: ..." без индекса ключа?

1 Ответ

0 голосов
/ 19 апреля 2020

Из списка специальных символов в разделе синтаксиса документа re :

. (точка). В режиме по умолчанию это соответствует любому символ кроме новой строки. Если указан флаг DOTALL, он соответствует любому символу, включая символ новой строки.

Метод Pattern.match():

Если ноль или более символы в начале строки соответствуют этому регулярному выражению, возвращают соответствующий объект соответствия. Вернуть None, если строка не соответствует шаблону; обратите внимание, что это отличается от совпадения нулевой длины.

Поскольку шаблон .*Grundpreis.* не будет соответствовать первому символу строки "\nGrundpreis: 1 Stück 0,14 €", так как он является новой строкой, match() возвращает None.


Вот пример, который должен вдохновить вас на то, что вы пытаетесь сделать:

import re

patt = re.compile(r"Grundpreis: (.*)")

test_strs = ['\nInhalt: 10 Stück', '\nGrundpreis: 1 Stück 0,14 €']

for elem in test_strs:
    res = patt.search(elem)
    if res:
        print(f"Match found in string: {elem}. Match: {res}. Group: {res.group(1)}")
    else:
        print(f"No match in string: {elem}")

Вывод:

No match in string: 
Inhalt: 10 Stück
Match found in string: 
Grundpreis: 1 Stück 0,14 €. Match: <re.Match object; span=(1, 27), match='Grundpreis: 1 Stück 0,14 €'>. Group: 1 Stück 0,14 €
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...