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

问题描述 投票:1回答:2

我必须提取网站上找到的品牌名称,型号和有时修剪水平的汽车。问题是,当我在我的正则表达式中放置两个组时,我无法访问第三个元素(汽车的修剪级别),当我在我的正则表达式中放置三个组时,我没有得到任何没有修剪级别的汽车。

<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)
python regex regex-group
2个回答
0
投票

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

使用手头的路径组件列表,您可以根据需要简单地迭代它。


0
投票

试试Regex:https:\/\/XXX\.ir\/car\/([^\/]+?)\/([^\/]+?)(?:\/([^\"]+))?\"

Demo

© www.soinside.com 2019 - 2024. All rights reserved.