Regex-Coding: UTF-8 汉字

本文详细介绍了配置文件的解析过程,包括设置、语言范围定义和正则表达式的使用,展示了如何通过正则表达式实现文本过滤与匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1  # -*- coding: utf-8 -*- 
 2  """ 
 3  config.py 
 4   
 5  Created by Manabu Terada, CMScom on 2009-08-08. 
 6  """ 
 7  import re 
 8   
 9  STOP_WORD = [] 
10   
11  ## Setting, adding langs. 
12  rangetable = dict( 
13      # ascii=u"a-zA-Z0-9_", 
14      # digit=u"\d", 
15   
16      # U+AC00-D7AF       Hangul Syllables        ハングル音節文字 
17      hangul=u"\uAC00-\uD7AF", 
18   
19      # U+30A0-30FF       Katakana        片仮名 
20      # U+3040-309F       Hiragana        平仮名 
21      # kana=u"\u3040-\u30FF", 
22      # hiragana=u"\u3040-\u309F\u30FC", 
23      # katakana=u"\u30A0-\u30FF", 
24   
25      # U+4E00-9FFF     CJK Unified Ideographs  CJK統合漢字 
26      # U+3400-4DBF     CJK Unified Ideographs Extension A  CJK統合漢字拡張A 
27      # U+F900-FAFF     CJK Compatibility Ideographs    CJK互換漢字 
28      # ideo=u"\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFF", 
29   
30      cj=u"\u3040-\u30FF\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFF", 
31      thai=u"\u0E00-\u0E7F",  # U+0E00-0E7F Thai タイ文字 
32  ) 
33  ## End of setting. 
34   
35   
36  ## Splitting core. 
37  ps = rangetable.values() 
38  allp = u"".join(ps) 
39  glob_true = u"[^%s]([^%s]|[\*\?])*|" % (allp, allp) + u"|".join([u"[%s]+" % (x, )  for x in ps]) 
40   
41  glob_false = u"[^%s]+|" % allp + u"|".join(u"[%s]+" % x  for x in ps) 
42   
43  rx_all = re.compile(ur"[%s]" % allp, re.UNICODE) 
44  rx_U = re.compile(r"\w+", re.UNICODE) 
45  rxGlob_U = re.compile(r"\w+[\w*?]*", re.UNICODE) 
46   
47  rx_L = re.compile(r"\w+", re.LOCALE) 
48  rxGlob_L = re.compile(r"\w+[\w*?]*", re.LOCALE) 
49   
50  # pattern = re.compile(u"[a-zA-Z0-9_]+|[\uac00-\ud7af]+|[\u4E00-\u9FFF\u3400-\u4dbf\uf900-\ufaff\u3040-\u30ff]+", re.UNICODE) 
51  # pattern_g = re.compile(u"[a-zA-Z0-9_]+[*?]*|[\u4E00-\u9FFF\u3400-\u4dbf\uf900-\ufaff\u3040-\u30ff\uac00-\ud7af]+[*?]*", re.UNICODE) 
52   
53  pattern = re.compile(glob_false, re.UNICODE) 
54  pattern_g = re.compile(glob_true, re.UNICODE) 
55   
优化代码:#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import re import sys import time import requests from tqdm import tqdm from bs4 import BeautifulSoup from urllib.parse import urljoin def download_vr_images( target_url, save_dir='/Users/sunhui/Downloads/tu', max_retry=3, timeout=30, concurrency=5 ): """ 全景图片下载核心函数 参数: - target_url: 目标网页URL - save_dir: 存储路径(默认:用户下载目录) - max_retry: 最大重试次数 - timeout: 请求超时时间(秒) - concurrency: 并发下载数 """ # ==================== 路径验证 ==================== if not os.path.isabs(save_dir): raise ValueError(f"路径必须为绝对路径:{save_dir}") illegal_chars = re.findall(r'[<>:"|?*]', save_dir) if illegal_chars: raise ValueError(f"路径包含非法字符:{''.join(set(illegal_chars))}") try: os.makedirs(save_dir, exist_ok=True) test_file = os.path.join(save_dir, '__perm_test.tmp') with open(test_file, 'w') as f: f.write('permission_test') os.remove(test_file) except Exception as e: raise RuntimeError(f"路径初始化失败: {str(e)}") # ==================== 网络请求 ==================== headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Referer': target_url } try: response = requests.get(target_url, headers=headers, timeout=timeout) response.raise_for_status() except requests.exceptions.RequestException as e: raise ConnectionError(f"网页请求失败: {str(e)}") # ==================== 内容解析 ==================== soup = BeautifulSoup(response.text, 'html.parser') # 两种图片链接提取策略 img_links = [] # 策略1:通过CSS类名匹配 vr_images = soup.select('div.vr-container img.full-res') # 策略2:通过正则表达式匹配 pattern = re.compile(r'(https?://\S+?\.(jpg|png|webp))', re.IGNORECASE) fallback_links = pattern.findall(response.text) if vr_images: for img in vr_images: img_url = img.get('data-src') or img.get('src') if img_url: img_links.append(urljoin(target_url, img_url)) elif fallback_links: img_links = [urljoin(target_url, link[0]) for link in fallback_links] else: raise ValueError("未检测到有效图片链接") # ==================== 下载逻辑 ==================== success_count = 0 for idx, img_url in enumerate(tqdm(img_links, desc="下载进度", unit="file"), 1): file_name = f"vr_image_{time.strftime('%Y%m%d%H%M%S')}_{idx}.{img_url.split('.')[-1]}" save_path = os.path.join(save_dir, file_name) for retry in range(max_retry + 1): try: with requests.get(img_url, stream=True, headers=headers, timeout=timeout) as r: r.raise_for_status() total_size = int(r.headers.get('content-length', 0)) with open(save_path, 'wb') as f: for chunk in r.iter_content(chunk_size=8192): if chunk: f.write(chunk) success_count += 1 break except Exception as e: if retry == max_retry: print(f"\n⚠️ 文件下载失败:{img_url} | 错误:{str(e)}") else: time.sleep(2 ** retry) # ==================== 结果报告 ==================== print(f"\n✅ 下载完成 | 成功:{success_count}/{len(img_links)}") print(f"📁 存储路径:{save_dir}") if __name__ == "__main__": # 使用示例 try: download_vr_images( target_url="https://vr.justeasy.cn/view/1709b5704a0u64f4-1711545753.html", save_dir="/Users/sunhui/Downloads/tu" ) except Exception as e: print(f"❌ 运行错误:{str(e)}") sys.exit(1)
03-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值