Regex извлекает подстроку Python - PullRequest
4 голосов
/ 15 июня 2019

Я пытаюсь извлечь подстроку от точной точки до специального символа ", это строка:

element = '<div class="s-suggestion" data-alias="aps" data-crid="2AZHZA23OLYLF" data-isfb="false" data-issc="false" data-keyword="aa battery plus" data-nid="" data-reftag="nb_sb_ss_i_6_2" data-store="" data-type="a9" id="issDiv5"><span class="s-heavy"></span>ab<span class="s-heavy">reva cold sore treatment</span></div>'

часть, которую я хочу извлечь - это ключевое слово из: data-keyword = символ «до: следующий», поэтому в данном случае: батарея плюс

но в результате я получаю букву, когда ограничиваю строку слева и справа разделителем \ b и квадратными скобками.

Я пытался использовать метод re.findall ()

import re
element = '<div class="s-suggestion" data-alias="aps" data-crid="2AZHZA23OLYLF" data-isfb="false" data-issc="false" data-keyword="aa batteries plus" data-nid="" data-reftag="nb_sb_ss_i_6_2" data-store="" data-type="a9" id="issDiv5"><span class="s-heavy"></span>ab<span class="s-heavy">reva cold sore treatment</span></div>'
z = re.search(r'[\bdata-keyword="\b,'""']',element).group(0)
print(z)

Вот что я получаю:

d
Process finished with exit code 0

Как мне извлечь только ключевое слово? IE: батарейки плюс

Ответы [ 6 ]

3 голосов
/ 15 июня 2019

Не рекомендуется использовать Regex для разбора HTML.Вместо этого вы можете использовать html-парсер, например BeautifulSoup.

Пример:

from bs4 import BeautifulSoup

element = '<div class="s-suggestion" data-alias="aps" data-crid="2AZHZA23OLYLF" data-isfb="false" data-issc="false" data-keyword="aa battery plus" data-nid="" data-reftag="nb_sb_ss_i_6_2" data-store="" data-type="a9" id="issDiv5"><span class="s-heavy"></span>ab<span class="s-heavy">reva cold sore treatment</span></div>'
soup = BeautifulSoup(element, "html.parser")
print(soup.find("div", class_="s-suggestion")["data-keyword"])

Выход:

aa battery plus
3 голосов
/ 15 июня 2019

Если вам нужен текст между двумя строками, вам нужно использовать этот формат регулярных выражений.

import re

element = '<div class="s-suggestion" data-alias="aps" data-crid="2AZHZA23OLYLF" data-isfb="false" data-issc="false" data-keyword="aa batteries plus" data-nid="" data-reftag="nb_sb_ss_i_6_2" data-store="" data-type="a9" id="issDiv5"><span class="s-heavy"></span>ab<span class="s-heavy">reva cold sore treatment</span></div>'

z = re.search(r'data-keyword="(.*?)"', element).group(1)
print(z)
1 голос
/ 15 июня 2019

Вы можете использовать re.findall() функцию:

import re
element = '<div class="s-suggestion" data-alias="aps" data-crid="2AZHZA23OLYLF" data-isfb="false" data-issc="false" data-keyword="aa battery plus" data-nid="" data-reftag="nb_sb_ss_i_6_2" data-store="" data-type="a9" id="issDiv5"><span class="s-heavy"></span>ab<span class="s-heavy">reva cold sore treatment</span></div>'
output = re.findall(r'data-keyword="(.*?)"', element)[0]
print(output)

Выход

батарея плюс

1 голос
/ 15 июня 2019

Хотя я полностью согласен с предыдущим ответом, вы также можете рассмотреть следующее решение:

element.split('data-keyword="')[-1].split('" data-nid')[0]

Это может показаться довольно удобным, когда вам нужно проанализировать "структурированные" входы ...

1 голос
/ 15 июня 2019

Это выражение, вероятно, может работать здесь, даже если это не лучшая идея, для которой мы могли бы подойти к решению проблемы, используя этот метод , но если нам нужно:

data-keyword="\s*([^"]+?)\s*"

может также удалить нежелательные пробелы до и после наших желаемых данных.

Демо 1

TEST

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"data-keyword=\"\s*([^\"]+?)\s*\""

test_str = ("<div class=\"s-suggestion\" data-alias=\"aps\" data-crid=\"2AZHZA23OLYLF\" data-isfb=\"false\" data-issc=\"false\" data-keyword=\"aa batteries plus\" data-nid=\"\" data-reftag=\"nb_sb_ss_i_6_2\" data-store=\"\" data-type=\"a9\" id=\"issDiv5\"><span class=\"s-heavy\"></span>ab<span class=\"s-heavy\">reva cold sore treatment</span></div>\n"
    "<div class=\"s-suggestion\" data-alias=\"aps\" data-crid=\"2AZHZA23OLYLF\" data-isfb=\"false\" data-issc=\"false\" data-keyword=\"    aa batteries plus     \" data-nid=\"\" data-reftag=\"nb_sb_ss_i_6_2\" data-store=\"\" data-type=\"a9\" id=\"issDiv5\"><span class=\"s-heavy\"></span>ab<span class=\"s-heavy\">reva cold sore treatment</span></div>")

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

выход

Match 1 was found at 105-137: data-keyword="aa batteries plus"
Group 1 found at 119-136: aa batteries plus
Match 2 was found at 417-458: data-keyword="    aa batteries plus     "
Group 1 found at 435-452: aa batteries plus

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

1 голос
/ 15 июня 2019

Вам не нужно регулярное выражение для этого. Вы можете просто выполнить поиск по индексу «ключевое слово данных» с помощью встроенной функции find(substring,begin,end). Затем выполните поиск индекса для каждой из следующих скобок и разделите текст между ними.

i_key = element.find('data-keyword')
i_1 = element.find('"', i_key)
i_2 = element.find('"', i_1+1)
z = element[i_1+1:i_2]

Больше информации о функции поиска .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...