如何在 python 3.7 中使用正则表达式来拥有 2 或 3 个组?

How use regex in python 3.7 to have 2 OR 3 groups?

我必须提取品牌名称、型号,有时还需要提取在网站上找到的汽车的 trim 级别。问题是,当我在我的正则表达式中放置两个组时,我无法访问第三个元素(汽车的 trim 级别),当我在我的正则表达式中放置三个组时,没有 trim 关卡。

<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)

这里的一个选择是使用库 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']

有了路径组件列表,您可以根据需要简单地对其进行多次迭代。

试试正则表达式:https:\/\/XXX\.ir\/car\/([^\/]+?)\/([^\/]+?)(?:\/([^\"]+))?\"

Demo