第8章:处理文本的神器“正则表达式”

文档格式转换神器:一键实现文本/Excel与CSV互转,解放你的数据处理时间 大文件转换时,系统采用分块读取(Chunked Reading)与异步写入技术,避免内存溢出,同时显示实时进度条提升用户体验。:文件上传后采用临时加密存储,转换完成后自动删除源文件与结果,杜绝数据泄露风险。:将CSV数据还原为Excel表格,支持自定义表头、调整列宽等基础格式设置。:无需下载Excel或专业数据处理工具,浏览器直接操作,节省设备存储空间。:基础功能免费使用,高级功能(如批量处理、大文件支持)按需付费,成本可控。将CSV格式的日志文件转为TXT,压缩后通过邮件发送。 阅读详情


一、处理文本的神器

假设公司仅给你1天的时间,需要将一篇10万字文本中的某十几个邮箱修改成指定邮箱,你该怎么办?
也许你会用Ctrl-F快速搜索。
但假设有些邮箱不需要修改,有些文本数字又和这些邮箱号码一样。
请问阁下又如何面对?

面对这一头疼的问题,还仅仅只给一天的时间,我想大部分人都要彻夜难眠了。
而Python就很好的给我们解决了这一问题。
当你写好一个def(函数)时,面对这一问题,仅仅只需要几分钟(编写匹配规则,运行函数),就能解决。

二、不用正则表达式,如何查找?

假设,你希望在字符串中,查找所有180开头的电话号码。比如“18000000000”。

def is_phone_number(text):
    if len(text) != 11:
        return False
    for i in range(0, 11):
        if not text[i].isdecimal():
            return False
    for i in range(0, 3):
        if text[0] != '1' or text[1] != '8' or text[2] != '0':
            return False
    return True


message = '手机号:18000000000,18000000001,17000000000'
for i in range(len(message)):
    chunk = message[i:i + 11]
    if is_phone_number(chunk):
        print(f'找到180开头的手机号:{chunk}')
print("程序运行结束!")

说实话,我第一次写教程,我竟然发现不用正则表达式,会这么恶心。。。

三、用正则表达式查找文本模式

接下来,我们就试试用正则表达式来找找看。

# 1.导入正则表达式模块
import re

#2. 创建正则表达式匹配规则
is_phone_number = re.compile(r'180\d\d\d\d\d\d\d\d')

#3. 待匹配的字符串
search_phone = is_phone_number.search('手机号:18000000000,18000000001,17000000000')

#4. 打印结果
print(f'找到180开头的手机号:{search_phone.group()}')

我们发现,这要比不用正则表达式的方法简单很多。

如果你们运行了上面这个代码,你会发现一个小小的问题。

问题的产生,就是因为search()只匹配一次,所以re模块还为我们提供了一个findall()的方法。

import re

is_phone_number = re.compile(r'180\d\d\d\d\d\d\d\d')
search_phone = is_phone_number.findall('手机号:18000000000,18000000001,17000000000')

for i in search_phone:
    print(i)

你会发现,当你要找出多个内容时,使用findall()是一个不错的选择。

四、用?号实现可选匹配

有时候,我们想匹配是可选的。

str_1 = "我是测试划水老师傅,记得点个关注!"
str_1 = "我是测试老师傅,记得点个关注!"
"""
我想用一个正则表达式,找出包含“测试**老师傅”的字符,该如何做?
"""

你可以用?号来实现匹配

regex = re.compile(r'测试(划水)?老师傅')
regex_str_1 = regex.search("我是测试划水老师傅,记得点个关注!").group()
print(regex_str_1)

regex_str_2 = regex.search("我是测试老师傅,记得点个关注!").group()
print(regex_str_2)

"""运行结果:
测试划水老师傅
测试老师傅
"""

(划水)? 代表“划水”时可选的,可以出现0次,也可以出现1次,这就是为什么我可以用同一个表达式,找出我期望的字符串。

五、用*号实现匹配0次或多次

假设我的名字中间的“划水”出现多次,而我想要匹配多次“划水”这个名词。
那刚才提到的正则就无法正常匹配。

import re

str_1 = "我是测试划水划水划水老师傅,记得点个关注!"

regex = re.compile(r'测试(划水)?老师傅')
regex_str_1 = regex.search("我是测试划水老师傅,记得点个关注!").group()
print(regex_str_1)

如果你运行了代码,会发现结果如下:

测试划水老师傅

但是与我预期不符,我想要匹配到的是“测试划水划水划水老师傅”!
修改正则匹配规则如下:

regex = re.compile(r'测试(划水)*老师傅')
regex_str_1 = regex.search("我是测试划水划水划水老师傅,记得点个关注!").group()
print(regex_str_1)

代码运行结果:

测试划水划水划水老师傅

六、用+号匹配一次或多次

与*号不同的是,+号要求被匹配的字符,至少出现一次,所以当没有匹配到的时候,会返回None。

import re

regex = re.compile(r'测试(划水)+老师傅')
regex_str_1 = regex.search("我是测试划水划水划水老师傅,记得点个关注!").group()
regex_str_2 = regex.search("测试老师傅,记得点个关注!")
print(regex_str_1)
print(regex_str_2)

"""运行结果:
测试划水划水划水老师傅
None
"""

七、用花括号匹配特定次数

import re

regex = re.compile(r'测试(划水){2}老师傅')
regex_str_1 = regex.search("我是测试划水划水划水老师傅,记得点个关注!")
regex_str_2 = regex.search("测试划水划水老师傅,记得点个关注!")
print(regex_str_1)
print(regex_str_2.group())
"""运行结果:
None
测试划水划水老师傅
"""

我们发现,括号内的{2},表示匹配“划水”出现两次,所以,regex_str_1的结果是None。

八、贪心和非贪心匹配

先直接看看代码示例,看看是什么导致输出不一样?

import re

# 贪心匹配
str_1 = "OHOHOHOHOH"
regex = re.compile(r'(OH){3,5}')
regex_str_1 = regex.search(str_1).group()
print(regex_str_1)
"""运行结果:
OHOHOHOHOH
"""

# 非贪心匹配(惰性匹配)
regex = re.compile(r'(OH){3,5}?')
regex_str_2 = regex.search(str_1).group()
print(regex_str_2)
"""运行结果:
OHOHOH
"""

首先解释下{3,5},是指至少匹配3个,最多匹配5个。
Python的正则表达式式默认贪心匹配,表示按照最多匹配数进行匹配,而在花括号之后加上“?”表示非贪心匹配,表示尽可能按照最短的匹配。

九、正则表达式模式

在之前学手机号匹配的代码中,我们用到了\d 表示代表任意数字,也就是说,\d是正则表达式(0|1|2|3|4|5|6|7|8|9)的缩写。
下表列出了正则表达式模式语法中的特殊元素。
如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。

模式描述
^匹配字符串的开头
$匹配字符串的末尾。
.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[…]用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’或’k’
[^…]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re*匹配0个或多个的表达式。
re+匹配1个或多个的表达式。
re?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{ n}精确匹配 n 个前面表达式。例如, o{2} 不能匹配 “Bob” 中的 “o”,但是能匹配 “food” 中的两个 o。
re{ n,}匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。“o{1,}” 等价于 “o+”。“o{0,}” 则等价于 “o*”。
re{ n, m}匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a| b匹配a或b
(re)对正则表达式分组并记住匹配的文本
(?imx)正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx)正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re)类似 (…), 但是不表示一个组
(?imx: re)在括号中使用i, m, 或 x 可选标志
(?-imx: re)在括号中不使用i, m, 或 x 可选标志
(?#…)注释.
(?= re)前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re)前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re)匹配的独立模式,省去回溯。
\w匹配字母数字及下划线
\W匹配非字母数字及下划线
\s匹配任意空白字符,等价于 [ \t\n\r\f]。
\S匹配任意非空字符
\d匹配任意数字,等价于 [0-9].
\D匹配任意非数字
\A匹配字符串开始
\Z匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
\z匹配字符串结束
\G匹配最后匹配完成的位置。
\b匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
\B匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
\n, \t, 等.匹配一个换行符。匹配一个制表符。等
\1…\9匹配第n个分组的内容。
\10匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

十、正则表达式实例

字符匹配

实例描述
python匹配 “python”.

字符类

实例描述
[Pp]ython匹配 “Python” 或 “python”
rub[ye]匹配 “ruby” 或 “rube”
[aeiou]匹配中括号内的任意一个字母
[0-9]匹配任何数字。类似于 [0123456789]
[a-z]匹配任何小写字母
[A-Z]匹配任何大写字母
[a-zA-Z0-9]匹配任何字母及数字
[^aeiou]除了aeiou字母以外的所有字符
[^0-9]匹配除了数字外的字符

特殊字符类

实例描述
.匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。
\d匹配一个数字字符。等价于 [0-9]。
\D匹配一个非数字字符。等价于 [^0-9]。
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]'。
\W匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’。

十一、用sub()替换文本

Python中的sub()函数是re模块中的一个函数,用于在字符串中替换指定的子字符串。
它的语法如下:

re.sub(pattern, repl, string, count=0, flags=0)

参数说明:
pattern:要查找的子字符串。
repl:要替换的字符串。
string:要在其中进行替换的原始字符串。
count:可选参数,指定替换操作的次数,如果设置为非零值,则只替换指定次数。
flags:可选参数,指定re模块的标志,如re.IGNORECASE等。
这是一个简单的示例代码:

import re

text = "hello world, world is beautiful"
new_text = re.sub("world", "Python", text)
print(new_text)  # "hello Python, Python is beautiful"

在这个例子中,sub()函数将字符串"world"替换为"Python",输出结果为"hello Python, Python is beautiful"。

十二、练习题

"""
假设你有一个任务,要在一篇长的网页或者文章中,找出所有手机号和E-mail地址。
请使用正则表达式设计你的代码。
"""
Linux文本处理神器awk实战案例 1. 什么是awk 2. 打印不同列的内容 3. 打印行号和列号 4. 修改输入和输出分隔符 5. 输入多个文件 6. 修改某一列的值 7. 条件筛选后打印 8. 运算 9. 正则表达式 阅读详情

相关推荐

HFSS实战(三)——过孔via TDR仿真

在上一讲中,主要是通过观察S参数确定via的优化是否达到目标。但S参数只能看到一个整体的结果,并不知道via真实的阻抗是多少?想要单独确定via的阻抗,最好还是通过TDR的仿真。

luohuo9844的博客 1万+

Java 文本检索神器 “正则表达式“

我相信,作为一名程序员或者准程序员,你肯定是知道正则表达式的。作为计算机领域最伟大的发明之一,正则表达式简单、强大,它可以极大地提高我们工作中的文本处理效率。现在,各大操作系统、编程语言、文本编辑器都已经支持正则表达式,甚至我还和极客时间的编辑开玩笑说,他们也应该好好学学正则这门手艺。正则,就是正则表达式,英文是Regular Expression,简称 RE。顾名思义,正则其实就是一种描述文本内容组成规律的表示方式。在编程语言中,正则常常用来简化文本处理的逻辑。在Linux。

BASK2311的博客 5万+

Linux之GTK系列教程

00、背上行囊1——程序员学习之道 01、背上行囊2——为什么要学习GTK 02、背上行囊3——GUI概述 03、背上行囊4——GTK简介 04、背上行囊5——GTK环境搭建( Linux ) 05、背上行囊6——GTK环境搭建( windows ) 06、踏上旅途1——一个简单的空白窗口 07、踏上旅途2——控件的添加 08、踏上旅途3——布局容器之水平布局 09、踏上旅途

每天积累一点点 2万+

Java 文本检索神器 “正则表达式”

我相信,作为一名程序员或者准程序员,你肯定是知道正则表达式的。作为计算机领域最伟大的发明之一,正则表达式简单、强大,它可以极大地提高我们工作中的文本处理效率。现在,各大操作系统、编程语言、文本编辑器都已经支持正则表达式,甚至我还和极客时间的编辑开玩笑说,他们也应该好好学学正则这门手艺。正则,就是正则表达式,英文是 Regular Expression,简称 RE。 顾名思义,正则其实就是一种 描述文本内容组成规律的表示方式。在编程语言中,正则常常用来简化文本处理的逻辑。在 Linux 命令中,它也可以帮助我

weixin_61635597的博客 973

局域网tcp通信实验

IPv4 地址 . . . . . . . . . . . . : 192.168.92.79。IPv4 地址 . . . . . . . . . . . . : 192.168.92.59。子网掩码 . . . . . . . . . . . . : 255.255.255.0。子网掩码 . . . . . . . . . . . . : 255.255.255.0。使用这篇文章的小工具。

weixin_51883798的博客 434

FPGA波束形成:从算法到硬件的艺术之旅

本文深入探讨了FPGA在波束形成技术中的应用,从算法原理到Verilog硬件实现的全过程。文章详细分析了FPGA并行处理、低延迟和可重构特性如何优化波束形成系统性能,并提供了Verilog关键模块代码示例和资源优化策略,为工程师实现高效FPGA波束形成解决方案提供实用指导。

tea88的博客 1044

AWK 文本处理神器:从入门到实战详解

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作数据可以来自标准输入也可以是管道或文件20世纪70年代诞生于贝尔实验室,现在centos7用的是gawk之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。awk。

ysw0618的博客 1298

立创开源PEX88048 8盘位M.2扩展卡硬件设计与PCIE4.0交换机应用解析

本文详细解析了基于Broadcom PEX88048 PCIe 4.0交换芯片的8盘位M.2扩展卡硬件设计。文章深入探讨了核心芯片选型、关键供电与安全设计、引脚配置、固件刷写方法,并重点剖析了PCIe 4.0时钟架构与高速PCB布局的核心思想,旨在帮助开发者理解如何设计高性能、高可靠性的存储扩展方案,并有效控制成本。

weixin_28949937的博客 617

测试工程师的「武器库」:这8款效率神器让你告别无效加班

今天要给大家介绍测试工程师的「武器库」——8 款效率神器。快来一起探索这些神奇的工具吧!

software_test010的博客 1032

MT6826SGT-STD-R绝对值编码器深度解析:精准控制+灵活编程

本文详细介绍MT品牌的高性能绝对值编码器——MT6826SGT-STD-R。:区别于传统增量式编码器,绝对值输出无需掉电归零,开机即获准确位置数据。的核心优势,结合应用场景与选型指南,为工程师提供一站式解决方案参考。MT6826SGT-STD-R是一款专为工业级精密控制设计的。该设备广泛应用于伺服系统、机器人关节校准、自动化产线等领域。:15bit分辨率实现细腻的位置反馈;:通过专用编写器可自定义多项关键参数;:优化电路设计,适应复杂电磁环境。

2501_93066786的博客 676

MAVLink协议详解

MAVLink是为微型飞行器MAV(Micro Air Vehicle)设计的(LGPL)开源的通讯协议。是无人飞行器和地面站(Ground Control Station ,GCS)之间,以及无人飞行器之间通讯常用的协议。APM、PIXHAWK飞控,Mission Planner、QGroundControl地面站均使用了MAVLink协议进行通讯。 MAVLink源码下载地址(现已更新至v2.0):https://github.com/mavlink/qgroundcontrol   用户手册:ht

程序猿老樊的博客 7704

window统计文本字节_Linux笔记【009】| 文本操作神器

一.常见查看文件命令1.cat 与tac命令cat 命令用于连接文件并打印到标准输出设备上。语法格式:cat [-AbeEnstTuv] [--help] [--version] fileName参数说明:-n 或 --number:由 1 开始对所有输出的行数编号。-b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号。-s 或 --squeeze-bla...

weixin_30249465的博客 191

多出来的那一截:Java 堆外内存 OOM 的来源分账、分流排查与治理解析

Java进程的RES常比-Xmx多出一截,堆却平稳。本文把堆外内存拆成直接缓冲区、Unsafe、JNI本地库、线程栈、元空间与文件映射六类,用JDK 8与17的六组实验对照RSS、NMT、BufferPool三本账:clear()不释放内存;MaxDirectMemorySize默认约等于堆上限且只管直接缓冲区;禁用显式GC会让申请线程退避半秒后失败;未关闭的Deflater零GC下让RSS涨1GB;Netty池内泄漏GC救不回。最后给出定性、对账、定位的排查路线与预算、编码、监控三层治理。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 14万+

Linux文本处理神器:Linux Upskill Challenge grep与管道命令实战

Linux Upskill Challenge是一个帮助新手掌握Linux技能的实用项目,其中**grep**和**管道命令**是文本处理的核心工具。通过本文的实战指南,你将快速学会如何用这些工具高效处理日志、筛选数据,让命令行操作变得简单而强大。 ## 为什么grep是Linux文本处理的黄金工具? 在Linux系统中,日志文件、配置文件和数据文件都是纯文本格式,而`grep`正是处理这些文

gitblog_01171的博客 1047

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

grepWin:Windows平台的终极正则表达式搜索神器完整指南

grepWin是一款专为Windows平台设计的功能强大且速度极快的正则表达式搜索和替换工具。作为开发者必备的效率工具,它能够帮助你在海量文件中快速定位和替换文本内容,大幅提升工作效率。无论你是程序员、系统管理员还是需要处理大量文本文件的普通用户,grepWin都能成为你的得力助手。 ## 为什么选择grepWin?🚀 在Windows平台上,虽然系统自带了搜索功能,但在处理复杂文本搜索和替

gitblog_00577的博客 827

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

linux文本处理三剑客基本用法,关于Linux文本处理“三剑客”的一些小操作。

Linux文本处理“三剑客”,即grep、sed、awk,这是Linux中最核心 的3个命令。一、首先做个简单的介绍:1、awk:linux三剑客老大,过滤,输出内容,一门语言。NR代表行号。2、sed: linux三剑客老二,流编辑器,实现对文件的增删改查替换;参数 -n 取消默认输出3、grep:linux三剑客老三,过滤所需要的内容。二、实践(企业面试题)创建ett.txt(内容为从1-10...

weixin_42515906的博客 511

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Shell 编程——则表达式与文本处理神器:从基础工具到sed实战

面对文本处理需求,如何快速选择工具?简单截取:用cut(按列/字符位置);排序/去重:用sort+uniq(先排序再去重);字符转换:用tr(替换/删除/压缩单字符);复杂匹配+修改:用sed(正则匹配、增删改查);数据统计:用awk(搭配前面的工具)。正则表达式是这些工具的“通用语言”,熟练掌握基础正则,再结合工具的核心参数,就能轻松应对绝大多数文本处理场景。建议大家拿实际文件多练习,比如分析系统日志(/var/log/messages),慢慢就能体会到这些工具的“威力”啦!

dfl2504的博客 1010

Linux笔记【009】| 文本操作神器

一.常见查看文件命令1.cat 与tac命令cat 命令用于连接文件并打印到标准输出设备上。语法格式:cat [-AbeEnstTuv] [--help] [--version] fil...

BioInfoNotes 266

正则表达式:从入门到实战,一篇文章掌握文本处理利器

在日常的编程工作中,你是否遇到过这些场景?从用户输入中验证邮箱、手机号是否合法从大量文本中快速提取特定的数据信息批量替换文档中的特定格式内容在日志文件中查找匹配特定模式的错误信息如果答案是肯定的,那么正则表达式(Regular Expression)就是你不可或缺的利器!今天我们就来深入探讨这个让无数程序员又爱又怕的文本处理神器。正则表达式(简称 regex 或 regexp)是一种用于描述字符串模式的特殊语法。

m0_74263216的博客 735

【开源:神器推荐】Python打造全能文本处理工具:从简繁转换到MD5加密一网打尽!

在数字化办公时代,文本处理是每个职场人士和开发者都绕不开的日常任务。今天我要向大家推荐一款基于Python+Tkinter开发的全功能本地化文本处理工具,它不仅具备基础的格式转换功能,更集成了中文特色处理、加密算法等实用功能,堪称文本处理领域的"瑞士军刀"!工具核心亮点🎨 美观的GUI界面支持多主题切换🔠 支持20+种文本转换功能📁 完善的导入导出系统🔍 智能搜索替换功能🖥️ 纯本地运行,保障数据安全功能全面而不臃肿纯Python实现便于二次开发无需联网保障数据隐私。

白泽的博客 1947

输入框回车多个文本_Linux笔记【009】| 文本操作神器

一.常见查看文件命令1.cat 与tac命令cat 命令用于连接文件并打印到标准输出设备上。语法格式:cat [-AbeEnstTuv] [--help] [--version] fileName参数说明:-n 或 --number:由 1 开始对所有输出的行数编号。-b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号。-s 或 --squeeze-bla...

weixin_39731456的博客 142
上一篇: 第7章:字符串操作
下一篇: 第1章:企业级研发&测试流程
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测试划水老师傅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值