python爬虫 - 进阶正则表达式

  🌈个人主页: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 retext = "abc123abc456"
result = re.search(r'a.*c', text)
print(result.group())  # 输出:abc123abc

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

(二)非贪婪模式

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

非贪婪量词:

  • *?:匹配前面的字符 0 次或多次,但尽可能少地匹配

  • +?:匹配前面的字符 1 次或多次,但尽可能少地匹配

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

示例:

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

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

(三)贪婪与非贪婪小结

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

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

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


三、总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java项目实战II基于Java+Spring Boot+MySQL的服装销售平台(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在当今数字…

uniapp-小程序开发0-1笔记大全

uniapp官网: https://uniapp.dcloud.net.cn/tutorial/syntax-js.html uniapp插件市场: https://ext.dcloud.net.cn/ uviewui类库: https://www.uviewui.com/ 柱状、扇形、仪表盘库: https://www.ucharts.cn/v2/#/ CSS样式&…

硬件开发笔记(三十一):TPS54331电源设计(四):PCB布板12V转5V电路、12V转3.0V和12V转4V电路

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/142757509 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

ansible 流程控制

目录 1.流程控制 2.handlers触发器 2.1使用handlers案例 3.when 判断 3.1 案例1 用于给task设置条件 满足或者不满足运行对应模块 3.2 案例2 如果系统是centos则安装sl,cowsay 如果是unbantu则安装cmatrix 4.循环 4.1案例 1.流程控制 hand…

Git客户端使用之TortoiseGit和Git

git客户端有两个分别是TortoiseGit和Git Git用于命令行TortoiseGit用于图形界面。无论是Git还是TortoisGit都需要生成公/私钥与github/gitlab建立加密才能使用。 一、先介绍Git的安装与使用 1、下载与安装 安装Git-2.21.0-64-bit.exe(去官网下载最新版64位的),安…

SpringMVC2~~~

目录 数据格式化 基本数据类型可以和字符串自动转换 特殊数据类型和字符串间的转换 验证及国际化 自定义验证错误信息 细节 数据类型转换校验核心类DataBinder 工作机制 取消某个属性的绑定 中文乱码处理 处理json和HttpMessageConverter 处理Json-ResponseBody 处理…

Python精选200Tips:186-190

针对序列(时间、文本)数据的网络结构 续 P186-- 双向LSTM(Bidirectional Long Short-Term Memory 2005)(1)模型结构说明(2)创新性说明(3)示例代码:IMDB电影评论情感分析 …

通义灵码 Visual Studio 下载安装指南(附安装包)

文章目录 前言一、下载和安装指南方法 1:从插件市场安装方法 2:下载安装包安装方法 3:登录并开启智能编码之旅 二、使用指南总结 前言 通义灵码是基于通义大模型的智能编程辅助工具,它提供了多种强大的功能,旨在助力开…

【ProtoBuf】基础使用与编译

文章目录 ProtoBuf的使用基本使用指定proto3语法package声明符定义消息(message)定义消息字段字段唯一编号 编译序列化与反序列化序列化与反序列化使用 ProtoBuf的使用 流程如下: 编写 .proto文件,定义结构对象(message)及属性内容使用 protoc 编译器编…

[Halcon矩阵] 通过手眼标定矩阵计算相机旋转角度

📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现…

GS-SLAM论文阅读笔记-MGSO

前言 MGSO首字母缩略词是直接稀疏里程计(DSO),我们建立的光度SLAM系统和高斯飞溅(GS)的混合。这应该是第一个前端用DSO的高斯SLAM,不知道这个系统的组合能不能打得过ORB-SLAM3,以及对DSO会做出怎么样的改进以适应高斯地图,接下来…

一次性语音芯片:重塑语音识别技术,引领智能化生活新时代

随着一次性语音芯片的突破性进展,语音识别技术正融入我们生活的方方面面,引领着智能化生活迈向一个全新的时代。这些芯片不仅体积小巧、成本低廉,更在性能上实现了质的飞跃,能够更精确地捕捉并理解人类语音。本文将解读关于一次性…

Crypto虐狗记---”你“和小鱼(五)

前言:剧情五 提示: 一种食物? 一种食物——培根:(A B 也暗示是培根加密) cyberpeace{attackanddefenceworldisinteresting} 密码学笔记——培根密码 - ILK - 博客园 (cnblogs.com)

Appium Device Farm安装教程

环境要求:Appium version ≥ 2.4.X 安装appium npm install -g appium2.11.3 如果安装提示如下问题 npm error code EEXIST npm error syscall rename npm error path /Users/wan/.npm/_cacache/tmp/d5787519 npm error dest /Users/wan/.npm/_cacache/content-…

Android一个APP里面最少有几个线程

Android一个APP里面最少有几个线程 参考 https://www.jianshu.com/p/92bff8d6282f https://www.jianshu.com/p/8a820d93c6aa 线程查看 Android一个进程里面最少包含5个线程,分别为: main线程(主线程)FinalizerDaemon线程 终结者守护线程…

cnn突破七(四层bpnet网络公式与卷积核bpnet公式相关)

我们要有一个概念,就是卷积核就是我们的w1,w12,w2 那么我们的5*5卷积核怎么表达,当他在14*14的图像中流动时,对应的像素也在变化 这个和我们的上面w1,w12,w2不同,因为这几个都是全…

7. 整数反转【数学】

文章目录 7. 整数反转解题思路Go代码 7. 整数反转 7. 整数反转 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [ − 2 31 , 2 31 − 1 ] [−2^{31}, 2^{31} − 1] [−231,231−1] &#xff0…

数学建模算法与应用 第12章 现代优化算法

目录 12.1 粒子群优化算法 Matlab代码示例:粒子群优化算法求解函数最小值 12.2 遗传算法 Matlab代码示例:遗传算法求解函数最小值 12.3 蚁群算法 Matlab代码示例:蚁群算法求解旅行商问题 12.4 Matlab 遗传算法工具 使用遗传算法工具箱…

U盘误删文件?一招教你轻松找回!

大家好!今天咱们来聊聊一个让人头疼却又常见的问题——U盘数据丢失。是不是有时候不小心删了个文件,或者格式化了U盘,结果发现重要资料不见了,心里那个急啊!别急,别急,今天我就给大家推荐几款免…

Scalable TCP 如何优化长肥管道

来看一个极简的拥塞控制实现 net/ipv4/tcp_scalable.c,去掉注释不到 50 行代码。它的介绍在 Scalable TCP-improving performance in highspeed networks。由于太简单,估计没什么人会在意。 本文说一下它背后的道理。 无论 bic/cubic,westw…