【Python爬虫实战】正则:中文匹配与贪婪非贪婪模式详解

【Python爬虫实战】正则:中文匹配与贪婪非贪婪模式详解

  🌈个人主页:https://blog.ZEEKLOG.net/2401_86688088?type=blog
🔥 系列专栏:https://blog.ZEEKLOG.net/2401_86688088/category_12797772.html

目录

前言

一、匹配中文

(一)匹配单个中文字符

(二)匹配多个连续的中文字符

(三)匹配中英文混合的文本中的中文字符

(四)匹配中文标点符号

(五)匹配中文字符和标点符号

(六)匹配所有 CJK (中文、日文、韩文) 字符

(七)匹配不包括中文的部分

(八)匹配中文总结

二、贪婪与非贪婪模式

(一)贪婪模式

(二)非贪婪模式

(三)贪婪与非贪婪小结

三、总结


前言

正则表达式是一种强大的工具,可以帮助我们在文本处理中灵活高效地匹配、查找、替换各种字符和字符串模式。对于中文字符的处理,正则表达式尤其有用,因为它可以通过 Unicode 范围直接匹配常用的汉字及标点符号。此外,正则表达式中的贪婪和非贪婪模式提供了不同的匹配策略,使我们能够更灵活地控制匹配的长度和范围。这篇文章将通过一些示例介绍如何使用正则表达式匹配中文字符,以及如何利用贪婪和非贪婪模式进行不同方式的匹配。


一、匹配中文

正则表达式可以用来匹配各种字符,包括中文字符。匹配中文字符的核心是利用 Unicode 字符集中的中文范围。在正则表达式中,中文字符的匹配一般使用字符范围 [\u4e00-\u9fa5],其中 \u4e00\u9fa5 是 Unicode 中常见中文字符的范围。

(一)匹配单个中文字符

要匹配单个中文字符,可以使用 [\u4e00-\u9fa5],它表示匹配一个中文字符。

示例:

import re text = "这是一个测试" # 匹配单个中文字符 result = re.findall(r'[\u4e00-\u9fa5]', text) print(result) # 输出: ['这', '是', '一', '个', '测', '试'] 

(二)匹配多个连续的中文字符

如果你想匹配多个连续的中文字符,可以使用 [\u4e00-\u9fa5]+,它表示匹配一个或多个连续的中文字符。

示例:

import re text = "这是一个测试" # 匹配多个连续的中文字符 result = re.findall(r'[\u4e00-\u9fa5]+', text) print(result) # 输出: ['这是一个测试'] 

(三)匹配中英文混合的文本中的中文字符

在处理包含中英文混合的文本时,可以用正则表达式只提取中文字符。

示例:

import re text = "This is a test. 这是一个测试。" # 匹配所有中文字符 result = re.findall(r'[\u4e00-\u9fa5]+', text) print(result) # 输出: ['这是一个测试'] 

(四)匹配中文标点符号

除了汉字,中文标点符号也有专门的 Unicode 范围。要匹配中文标点符号,可以使用 [\u3000-\u303F] 这个范围。

示例:

import re text = "你好,世界!这是一个测试。" # 匹配中文标点符号 result = re.findall(r'[\u3000-\u303F]', text) print(result) # 输出: [',', '!', '。'] 

(五)匹配中文字符和标点符号

如果要同时匹配中文字符和中文标点,可以将这两部分结合在一起。例如,使用 [\u4e00-\u9fa5\u3000-\u303F]+ 来匹配。

示例:

import re text = "你好,世界!这是一个测试。" # 匹配中文字符和中文标点 result = re.findall(r'[\u4e00-\u9fa5\u3000-\u303F]+', text) print(result) # 输出: ['你好', ',', '世界', '!', '这是一个测试', '。'] 

(六)匹配所有 CJK (中文、日文、韩文) 字符

如果要匹配所有 CJK(中日韩)字符,可以使用 Unicode 字符集中的范围 [\u4e00-\u9FFF]

示例:

import re text = "中文, 한국어, 日本語" # 匹配所有 CJK 字符 result = re.findall(r'[\u4e00-\u9FFF]+', text) print(result) # 输出: ['中文', '한국어', '日本語'] 

(七)匹配不包括中文的部分

可以使用反向匹配来排除中文部分。例如,匹配非中文字符的部分,可以使用 [^ \u4e00-\u9fa5]+

示例:

import re text = "这是1234一个测试test。" # 匹配非中文的字符 result = re.findall(r'[^ \u4e00-\u9fa5]+', text) print(result) # 输出: ['1234', 'test'] 

(八)匹配中文总结

正则表达式通过 Unicode 范围可以轻松匹配中文字符。使用 [\u4e00-\u9fa5] 匹配常用汉字字符,同时可以通过调整范围和组合来匹配标点符号、CJK 字符以及中英文混合的内容。通过合理使用这些技巧,你可以在文本处理和解析过程中高效地提取和操作中文字符。


二、贪婪与非贪婪模式

在 Python 中,正则表达式的贪婪和非贪婪模式控制了匹配时字符的数量:

(一)贪婪模式

贪婪模式会尽可能多地匹配字符,直到整个表达式不再匹配为止。默认情况下,Python 正则表达式是贪婪的,即量词(如 *+{m,n})会尝试匹配尽可能多的字符。

常见的贪婪量词:

  • *:匹配前面的字符 0 次或多次
  • +:匹配前面的字符 1 次或多次
  • {m,n}:匹配前面的字符至少 m 次,至多 n 次

示例:

import re text = "abc123abc456" result = re.search(r'a.*c', text) print(result.group()) # 输出:abc123abc 

在上面的示例中,.* 是贪婪匹配,会尽可能多地匹配字符,直到最后一个 c,因此匹配了 "abc123abc"。

(二)非贪婪模式

非贪婪模式,也称为惰性匹配,会尽可能少地匹配字符。你可以在贪婪量词后加上一个 ? 来实现非贪婪匹配。例如:*?+?{m,n}?

非贪婪量词:

  • *?:匹配前面的字符 0 次或多次,但尽可能少地匹配
  • +?:匹配前面的字符 1 次或多次,但尽可能少地匹配
  • {m,n}?:匹配前面的字符至少 m 次,至多 n 次,但尽可能少地匹配

示例:

import re text = "abc123abc456" result = re.search(r'a.*?c', text) print(result.group()) # 输出:abc 

在上面的示例中,.*? 是非贪婪匹配,它会尽可能少地匹配字符,所以它匹配了 "abc"(第一个 a 到第一个 c 之间的内容)。

(三)贪婪与非贪婪小结

  • 贪婪模式:默认模式,会尽可能多地匹配字符。
  • 非贪婪模式:通过 ? 将贪婪量词转换为非贪婪,会尽可能少地匹配字符。
  • 常见的用法是通过在量词后添加 ?,如 *?+? 来启用非贪婪模式。

三、总结

通过本文的介绍,我们可以看到正则表达式在处理中文字符时的强大能力。从匹配单个或多个汉字,到捕获中英文混合文本中的中文部分,再到提取特定的中文标点符号,正则表达式都能轻松应对。同时,掌握贪婪和非贪婪模式的差异可以帮助我们在匹配字符时更加精准。在文本解析和数据清理任务中,熟练运用这些正则表达式技巧将为我们带来极大的便利和效率。

Read more

OpenClaw之Memory配置成本地模式,Ubuntu+CUDA+cuDNN+llama.cpp

文章目录 * 背景:Memory不生效的问题 * OpenClaw的Memory配置 * Ubuntu24.04安装CUDA和cuDNN * 编译llama.cpp * 验证方案1: * 验证方案2:下载并运行Llama-2 7B模型 * 安装node-llama-cpp * 验证Memory * sqlite-vec unavailable * 踩过的坑 * 安装node-llama-cpp的一些提示 * 安装node-llama-cpp的前置条件 * Using `node-llama-cpp` With Vulkan 承接上文:Windows11基于WSL2首次运行Openclaw,并对接飞书应用,我已经在电脑上安装了OpenClaw,接下来解决Memory问题。走了很多弯路,下面主要讲我总结的正确的安装过程。 总结来说:针对Memory不生效的问题,又不想用OpenAI或Gemini,或者只想单纯的节省token,可以按照如下的方式,设置为local模式: * 修改openclaw.json配置 * 安装CUDA和cu

论文阅读详细版K-RagRec:Knowledge Graph Retrieval-Augmented Generation for LLM-based Recommendation

摘要(Abstract) 翻译 推荐系统在我们的日常生活中变得越来越重要,有助于缓解各类面向用户的在线服务中的信息过载问题。大语言模型(LLMs)的出现取得了显著成就,展现出其推动下一代推荐系统发展的潜力。尽管取得了这些进展,基于大语言模型的推荐系统仍面临源于其模型架构的固有局限性,尤其是幻觉问题(生成虚假信息)以及缺乏最新知识和领域特定知识的问题。近年来,检索增强生成(RAG)技术受到了广泛关注,它通过利用外部知识源来增强大语言模型的理解和生成能力,从而解决这些局限性。然而,传统的 RAG 方法往往会引入噪声,并且忽略了知识中的结构化关系,这限制了它们在基于大语言模型推荐系统中的效果。为了解决这些问题,我们提出从知识图谱中检索高质量、最新的结构化信息,以增强推荐效果。具体而言,我们设计了一个检索增强框架,名为 K-RagRec,该框架通过整合外部知识图谱的结构化信息,助力推荐生成过程。我们进行了大量实验,验证了所提方法的有效性。 讲解 * 摘要就是论文的 “浓缩版故事”,核心逻辑: 1. 背景:推荐系统很重要,大语言模型能做推荐,但有两个大问题 ——“瞎编(幻觉)”

【实战干货】消费级显卡的逆袭:Stable Diffusion 3.5 FP8 模型部署与性能优化全指南

【实战干货】消费级显卡的逆袭:Stable Diffusion 3.5 FP8 模型部署与性能优化全指南

🚀 前言:SD3.5 虽好,显存却成了拦路虎? Stability AI 发布的 Stable Diffusion 3.5 (SD3.5) 系列模型,特别是 SD3.5 Large (8B 参数),在图像质量、提示词依从性(Prompt Adherence)和文字生成能力上都达到了开源模型的顶峰。然而,随之而来的是巨大的显存开销。 在传统的 BF16/FP16 精度下,运行 SD3.5 Large 加上庞大的 T5 文本编码器,往往需要 24GB 甚至更高的显存,这让持有 8GB/12GB 显存的广大开发者望洋兴叹。 破局者出现了:FP8(8位浮点)量化。

基于Jetson Nano与YOLOv5s的无人机道路抛洒物实时检测系统【附数据集+代码】

1. 为什么需要无人机道路抛洒物检测系统 想象一下你正开车行驶在高速公路上,突然前方出现一个不明物体——可能是掉落的纸箱、滚动的矿泉水瓶,甚至是散落的碎石。这些看似不起眼的小东西,在高速行驶状态下可能酿成大祸。传统的人工巡检方式效率低下,往往需要工作人员冒着危险在车流中穿行,而且很难做到全天候监控。这就是为什么我们需要一个智能化的解决方案。 我在实际测试中发现,使用无人机搭载视觉检测系统可以完美解决这个问题。无人机能够从高空俯拍道路,避开地面交通干扰;边缘计算设备Jetson Nano则让实时分析成为可能;而YOLOv5s算法就像给无人机装上了"火眼金睛",能瞬间识别出那些危险的抛洒物。这三者的结合,相当于给道路安全装上了全天候的智能哨兵。 2. 硬件选型与系统搭建 2.1 Jetson Nano的边缘计算优势 Jetson Nano这块小板子真是让我又爱又恨。爱的是它128核Maxwell GPU带来的强大算力,恨的是在资源有限的情况下做优化确实需要费些心思。不过经过多次调试,我发现它确实是无人机视觉处理的绝配——功耗仅5-10W,重量不到100克,却能流畅运行YOLOv