python爬虫 - 进阶正则表达式

news2024/11/24 13:26:19

  🌈个人主页:https://blog.csdn.net/2401_86688088?type=blog
🔥 系列专栏:https://blog.csdn.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 之间的内容)。

(三)贪婪与非贪婪小结

  • 贪婪模式:默认模式,会尽可能多地匹配字符。

  • 非贪婪模式:通过 ? 将贪婪量词转换为非贪婪,会尽可能少地匹配字符。

  • 常见的用法是通过在量词后添加 ?,如 *?+? 来启用非贪婪模式。


三、总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2209088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网易云音乐】--源代码分享

最近写了一个网易云音乐的音乐实现部分,是通过JavaScript和jQuery实现的,具体效果大家可以参照下面的视频 源代码分享 - git地址: 网易云音乐源代码 下面将着重讲解一下音乐实现部分 视频有点模糊,不好意思,在b站上添加视频的时候…

【Oracle DB故障分享】分享一次由于SGA设置太小导致的DP备份失败

List item 今天给客户做Oracle例行数据库健康巡检,过程中检出一些备份异常,分享如下。 排查问题: 打开DP备份软件,随即弹出如下提示: 登录DP,查看备份情况:发现从10/6开始,DP备份…

ESP32—C3实现DS18B20(温度传感器)检测温度(Arduino IED )

1源代码&#xff08;DS18B20&#xff09; #include <OneWire.h> // 引入OneWire库&#xff0c;用于与单总线设备通信 #include <DallasTemperature.h> // 引入DallasTemperature库&#xff0c;用于读取DS18B20温度传感器数据// 定义连接到DS18B20数据引脚的GPIO编…

Vue入门-指令修饰符-@keyup.enter

指令修饰符&#xff1a; 通过"."指明一些指令后缀&#xff0c;不同后缀封装了不同的处理操作 ->简化代码 ①按键修饰符 keyup.enter ->键盘回车监听 ".enter"if(e.keyenter){} //".enter"用来简化代码 demo&#xff1a; <!DOCTYPE…

Ubuntu系统可以使用WIFI上网,而插网线有线网不能上网,网卡驱动未安装问题解决

文章目录 问题分析解决结果 问题 linux ubuntn系统下可以正常连WiFi上网&#xff0c;但是不能插网线上网。 分析 首先要排除是否为硬件问题&#xff0c;我在windows下是可以正常使用网线的&#xff0c;所以排除硬件的问题。 查看网卡是否被检测(wifi有说明网卡是有检测的) …

有了WPF后Winform还有活路吗?

近年来&#xff0c;随着技术的不断发展&#xff0c;Windows Presentation Foundation&#xff08;WPF&#xff09;和Windows Forms&#xff08;WinForms&#xff09;这两种技术在开发桌面应用程序方面一直备受关注。虽然WPF以其强大的功能和灵活性吸引了众多开发者&#xff0c;…

【iOS】YYModel的初步学习

YYModel的初步学习 文章目录 YYModel的初步学习前言与JSONModel对比YYModel的优势如何使用YYModel最简单的Model形式容器类属性白名单和黑名单Model的嵌套 小结 前言 随着时代的发展&#xff0c;iOS解析JSON数据的第三方库越来越多&#xff0c;原先的JSONModel的性能上的问题逐…

【动手学深度学习】6.4 多输入多输出通道

彩色图像具有标准的RBG通道来代表红绿蓝&#xff0c;但是到目前位置我们仅展示了单个输入和单个通道的简化例子。这使得我们可以将输入&#xff0c;卷积核和输出看作二维张量而当我们添加通道时&#xff0c;输入和隐藏表示都变成了三维张量。例如每个RGB输入图像都具有 3 h …

工具篇-完整的 Git 项目管理工具教程(在命令框中使用 Git、在 IDEA 中使用 Git)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Git 概述 2.0 Git 的安装和配置 3.0 获取本地仓库 3.1 基础操作指令 3.2 分支 4.0 Git 远程仓库 4.1 创建远程仓库 4.2 配置 SSH 公钥 4.3 操作远程仓库 5.0 使用…

活动预告|博睿数据将受邀出席GOPS全球运维大会上海站!

第二十四届 GOPS 全球运维大会暨研运数智化技术峰会上海站将于2024年10月18日-19日在上海中庚聚龙酒店召开。大会将为期2天&#xff0c;侧重大模型、DevOps、SRE、AIOps、BizDevOps、云原生及安全等热门技术领域。特设了如大模型 运维/研发测试、银行/证券数字化转型、平台工程…

Qt-系统处理窗口移动和大小改变相关事件(60)

目录 描述 使用 补充&#xff1a;事件分发 / 事件过滤 描述 移动和改变窗口大小事件 使用 重写事件 移动窗口位置 改变窗口大小 补充&#xff1a;事件分发 / 事件过滤 这个属于事件背后的逻辑&#xff0c;可以让程序员有更多的操作&#xff0c;不过要小心使用&#xff0c…

凸函数 (Convex Function)

文章目录 1.凸函数定义2. 凸函数和非凸函数的图示3.闭凸函数 1.凸函数定义 凸函数是指在其图像上的任意两个点之间画一条线&#xff0c;这条线始终不会低于函数图像。其数学定义为对于任何两个点 x x x 和 y y y&#xff0c;以及 λ ∈ [ 0 , 1 ] \lambda \in [0,1] λ∈[0,…

51单片机的智能温控风扇【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器步进电机按键、蜂鸣器、LED等模块构成。适用于智能风扇调速等相似项目。 可实现功能: 1、LCD1602实时显示温度、自动/手动和风扇风力等级 2、温度传感器DS18B20采集温度信息 3、手动模式&#xff1a;可…

【软件测试】基本知识3

一、能够说出软件缺陷判定标准 说明&#xff1a;执行结果与用例的期望结果不一致&#xff08;含义&#xff09;&#xff0c;为缺陷。 缺陷的定义&#xff1a;软件在使用过程中存在的任何问题都叫软件的缺陷&#xff0c;简称bug 缺陷判定标准 软件未实现需求&#xff08;规格&…

[单master节点k8s部署]37.微服务(一)springCloud 微服务

微服务架构的一个重要特点是&#xff0c;它与开发中使用的具体编程语言或技术栈无关。每个微服务都可以使用最适合其功能需求的语言或技术来实现。例如&#xff0c;一个微服务可以用Java编写&#xff0c;另一个微服务可以用Python、Go、Node.js等编写。微服务架构允许这种灵活性…

OpenCV高级图形用户界面(5)获取指定滑动条(trackbar)的当前位置函数getTrackbarPos()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 返回滑动条的位置。 该函数返回指定滑动条的当前位置。 cv::getTrackbarPos() 函数用于获取指定滑动条&#xff08;trackbar&#xff09;的当前…

【C++差分数组】P1672何时运输的饲料

本文涉及知识点 C差分数组 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 P1672何时运输的饲料 原文比较啰嗦&#xff0c;我简述一下&#xff1a; 第x天运来F1(1<F1<1e6)千克的饲料&#xff0c;第D&#xff08;1<2e3)天还剩F2&…

数据结构-5.7.二叉树的层次遍历

一.演示&#xff1a; 1.初始化队列&#xff1a; 2.根结点入队&#xff1a; 3.判断队列是否为空&#xff0c;此时有根结点&#xff0c;说明不为空&#xff0c;则队头结点即根结点出队并访问&#xff0c;再先进它的左结点&#xff0c;最后进它的右结点&#xff1a; 4.之后对进来…

4.stm32 GPIO输入

按键简介 按键&#xff1a;常见的输入设备&#xff0c;按下导通&#xff0c;松手断开 按键抖动&#xff1a;由于按键内部使用的是机械式弹簧片来进行通断的&#xff0c;所以在按下和松手的瞬间会伴随有一连串的抖动 传感器模块简介 传感器模块&#xff1a;传感器元件&#…

如何使用ssm实现超市管理系统

TOC 10917ssm超市管理系统 系统概述 进过系统的分析后&#xff0c;就开始记性系统的设计&#xff0c;系统设计包含总体设计和详细设计。总体设计只是一个大体的设计&#xff0c;经过了总体设计&#xff0c;我们能够划分出系统的一些东西&#xff0c;例如文件、文档、数据等。…