Как использовать регулярные выражения в Python 3.7, чтобы иметь 2 или 3 группы? - PullRequest
1 голос
/ 01 апреля 2019

Я должен извлечь название марки, модель и иногда уровень комплектации автомобилей, найденных на сайте. Проблема в том, что когда я помещаю две группы в свое регулярное выражение, у меня нет доступа к третьему элементу (уровень комплектации автомобиля), а когда я помещаю три группы в свое регулярное выражение, я ничего не получаю от автомобилей без уровней отделки салона.

<a href="https://XXX.ir/car/bmw/x4">بی‌ام‌و ایکس ۴ </a>
<a href="https://XXX.ir/car/peugeot/405/glx">پژو ۴۰۵ جی‌ال‌ایکس</a>

my_regex_1 = r'https:\/\/XXX\.ir\/car\/(.+)\/(.+)\/(.+)'
my_regex_2 = r'https:\/\/XXX\.ir\/car\/(.+)\/(.+)\/'

Мой код:

import requests
from bs4 import BeautifulSoup
import re

mainpage = requests.get('https://bama.ir/')
soup = BeautifulSoup(mainpage.text, 'html.parser')
brands = soup.find_all('a')
infos = []
for item in brands:
    link = item['href']
    info = re.findall(r'https:\/\/bama\.ir\/car\/([^\/]+?)\/([^\/]+?)(?:\/([^"]+))?', link)
    infos.append(info)
print(infos)

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Попробуйте Regex: https:\/\/XXX\.ir\/car\/([^\/]+?)\/([^\/]+?)(?:\/([^\"]+))?\"

Демо

0 голосов
/ 01 апреля 2019

В этом случае можно использовать библиотеку urlparse и вообще не использовать регулярное выражение:

input = "<a href=\"https://XXX.ir/car/bmw/x4/lx\">بی‌ام‌و ایکس ۴ ال‌ایکس</a>"
url = re.sub(r'.*(https?://[^"]+).*', '\\1', input)
path = urlparse.urlparse(url).path
parts = path[1:].split('/')
print(parts)

['car', 'bmw', 'x4', 'lx']

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

...