百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

玩转Python正则表达式,开启高效数据提取之旅

lipiwang 2025-03-25 15:02 6 浏览 0 评论

正则表达式(Regular Expression)是一种用来匹配字符串特定模式(match patterns)的强大工具。

它能快速、灵活地(quickly and flexibly)对文本进行搜索、替换、分割(split)等操作,大幅提高处理字符串的效率。

本教程将从正则表达式的基本概念、常用语法到 Python 中的使用方式做详细介绍(a detailed introduction),附带(accompanied by)丰富(rich)示例帮助你更好地掌握。


1. 基本概念 (Basic Concepts)

  • 元字符Metacharacters:在正则表达式中具有特殊意义的字符,如 .^$*+?[]()\|
  • 量词Quantifiers指定(specify)匹配次数的符号,(e.g) *(匹配 0 次或多次)、+(1 次或多次)、?(0 次或 1 次)、{n}(固定次数)等

2. Python 中的 re 模块 (re Module)

Python 提供了内置的 re 模块来支持正则表达式相关操作,无需额外安装即可使用。

2.1 导入模块 (Importing the Module)

import re  #所有正则相关函数都在 re 模块中,例如 re.match(), re.search(), re.findall()

3. 常用函数与用法 (Common Functions & Usage)

3.1 match和search

  • re.match(pattern, string)
    从字符串开头尝试匹配,若开头部分匹配成功则返回match对象否则返回 None(Returns a Match object if successful, else None)

  • re.search(pattern, string):在整个字符串范围内(throughout the string)搜索第一个符合 pattern 的位置。

示例

import re

text = "晚饭吃火锅"
m1 = re.match(r"晚饭", text)
m2 = re.search(r"吃", text)
m3 = re.match(r"火锅",text)

print("match:", m1)   # 因为句子开头就是"晚饭",所以匹配成功
print("search:", m2)  # 句子里面有"吃",同样也能匹配成功
print("match:",m3)  #返回None

3.2 re.findall() 和 re.finditer()

  • re.findall(pattern, string):返回所有不重叠匹配的列表(non-overlapping matches)。
  • re.finditer(pattern, string):返回一个可迭代对象,每个元素是一个 Match。

示例

import re

text = "邮箱:abc@mail.com,另一个邮箱:xyz@mail.com"
emails = re.findall(r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}", text)
print(emails)  # ['abc@mail.com', 'xyz@mail.com']

邮箱匹配解释:

  • [a-zA-Z0-9._%+-]+这部分用于匹配电子邮件地址的用户名部分, 即@符号之前的部分
  • 匹配一个或多个字母(大小写)、数字、点(.)、下划线(_)、百分号(%)、加号(+)或减号(-),最后的+号表示前面的元素必须出现 1 次或多次
  • @[a-zA-Z0-9.-]+这部分用于匹配电子邮件地址的域名部分(即 @ 符号之后的部分)。域名通常由字母、数字、点或减号组成,如sub.domain.co.uk
  • \.匹配一个点(.)。在正则表达式中,点(.)是一个特殊字符,表示匹配任意单个字符。因此,需要用反斜杠(\)对其进行转义,使其表示字面上的点
  • [a-zA-Z]{2,} 匹配两个或更多字母(大小写), 这部分用于匹配顶级域名(TLD),如 .com、.org、.net 等。顶级域名通常由两个或更多字母组成

3.3 re.sub() 和 re.split()

  • re.sub(pattern, repl, string):用 repl 替换字符串中符合 pattern 的部分,并返回替换后的结果。
  • re.split(pattern, string):按照匹配到的 pattern 分割字符串,返回列表。

示例

import re
# 替换示例
原句 = "咖啡好喝,奶茶好喝,酒好喝"
新句 = re.sub("好喝", "不好喝", 原句)
print(新句)  #输出"咖啡不好喝,奶茶不好喝,酒不好喝"

# 分割示例
长句 = "他是个饭桶,不会做饭,只会洗碗"
短句 = re.split(",", 长句)
print(短句)  #输出 ['他是个饭桶', '不会做饭', '只会洗碗']

4. 正则表达式语法要点 (Key Regex Syntax)

语法

含义

示例

.

匹配除换行符外的任意字符

a.b 可匹配 "axb"、"a9b" 等

^ / $

匹配字符串的开头 / 结尾

^abc 匹配 "abc..."

*

匹配前一个表达式 0 次或多次

ab* 可匹配 "a", "ab", "abb" 等

+

匹配前一个表达式 1 次或多次

ab+ 可匹配 "ab", "abb" 等

?

匹配前一个表达式 0 次或 1 次

ab? 可匹配 "a" 或 "ab"

{n,m}

匹配前一个表达式 n~m 次

ab{1,3} 可匹配 "ab", "abb", "abbb"

[]

字符类,匹配方括号内任意一个字符

[abc] 匹配 "a", "b", 或 "c"

[^...]

非字符类,匹配不在括号内的字符

[^0-9] 匹配任何非数字字符

`

`

或运算,匹配符号两边任意一个表达式

()

分组,匹配并捕获组内容

(ab)+ 匹配 "ab", "abab", "ababab"

\d / \w

匹配数字 / 匹配字母数字下划线

\d 相当于 [0-9], \w 相当于 [A-Za-z0-9_]

\s

匹配任意空白字符 (空格、制表符等)

\s+ 匹配一个或多个空白


5. 编译正则表达式 (Compiling Regex)

使用 re.compile(pattern, flags=0) 可以预编译正则表达式,提高多次重复匹配的效率,并可指定模式修饰符(如 re.IGNORECASE)。

import re

#	入门示例
模式 = re.compile(r"hello", re.IGNORECASE)  #忽略大小写
result = 模式.search("HELLo这个精彩的世界")
print(result)  # 匹配成功

# 验证电话号
号码模式 = re.compile(r"^1\d{10}$")  #表示1开头,数字结尾,总共11位数字
所有号码 = ["13912345678", "12345", "18888888888"]

for 号 in 所有号码:
    print(号, "->", bool(号码模式.match(号)))

# 验证邮箱 
邮箱模式 = re.compile(r"^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$")
所有邮箱 = ["abc@mail.com", "test123@domain.co", "invalid@.com"]

for 邮 in 所有邮箱:
    print(邮, "->", bool(邮箱模式.match(邮)))

6. 小贴士与注意事项 (Tips & Caveats)

  1. 注意转义:在正则中,\ 具有特殊意义,如需匹配反斜杠本身需写 \\。

  2. 调试技巧:可以使用在线正则测试工具或 re.DEBUG 标志调试表达式。

  3. 避免滥用:正则虽强大,但处理复杂逻辑或嵌套结构时可读性不佳,应量力而行。
    (Regex is powerful but can become unreadable if overused for complex logic.)

熟练运用正则表达式后,你将能在文本处理、数据清洗、日志分析等领域如鱼得水

相关推荐

httpclient+jsoup实现小说线上采集阅读

前言  用过老版本UC看小说的同学都知道,当年版权问题比较松懈,我们可以再UC搜索不同来源的小说,并且阅读,那么它是怎么做的呢?下面让我们自己实现一个小说线上采集阅读。(说明:仅用于技术学习、研究) ...

Python3+requests+unittest接口自动化测试实战

一、Requests介绍RequestsisanelegantandsimpleHTTPlibraryforPython,builtforhumanbeings.翻译过来就是...

授权码 + PKCE 模式|OIDC & OAuth2.0 认证协议最佳实践系列【03】

在上一篇文章中,我们介绍了OIDC授权码模式,本次我们将重点围绕授权码+PKCE模式(AuthorizationCodeWithPKCE)进行介绍,从而让你的系统快速具备接入用户认...

JWT 在 Java Web 开发中的奇妙应用

JWT在JavaWeb开发中的奇妙应用在当今的互联网世界里,安全始终是一个绕不开的话题。而当我们谈论到Web应用的安全性时,认证和授权绝对是其中的核心部分。说到这,我忍不住要给大家讲个笑话...

动手操作:一个 OAuth 2 应用程序(2) - 配置 Keycloak 为授权服务器

接上一篇《动手操作:一个OAuth2应用程序(1)-应用程序场景》进行场景分析后,本篇就开始动手实现授权服务器。在本文中,我们将Keycloak配置为系统的授权服务器(图3)。...

JSON Web Token是什么?

JSONWebToken(缩写JWT)是目前最流行的跨域认证解决方案。传统的session认证http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证...

Keycloak Servlet Filter Adapter使用

KeycloakClientAdapters简介Keycloakclientadaptersarelibrariesthatmakeitveryeasytosecurea...

使用JWT生成token

一、使用JWT进行身份验证1、传统用户身份验证Internet服务无法与用户身份验证分开。一般过程如下:用户向服务器发送用户名和密码。验证服务器后,相关数据(如用户角色,登录时间等)将保存在当前会话中...

在word中通过VBA调用百度翻译API在线翻译

一天的时间,借助各种AI终于解决了这个问题:在word中通过VBA调用百度翻译API进行在线翻译。给我的word又添加了一项神技。先上代码:Sub宏5()''宏5宏Dimapp...

API 安全之认证鉴权

作者:半天前言API作为企业的重要数字资源,在给企业带来巨大便利的同时也带来了新的安全问题,一旦被攻击可能导致数据泄漏重大安全问题,从而给企业的业务发展带来极大的安全风险。正是在这样的背景下,Ope...

用WordPress建站哪些插件会拖慢速度影响排名?

你是否发现网站加载总慢半拍,SEO排名死活上不去?八成是插件惹的祸!80%的站长不知道,WordPress插件用错类型或配置不当,分分钟让网站速度暴跌,爬虫抓取效率直接砍半。缓存插件没装对,越用越卡你...

JavaScript报错了?不要慌!怎么看怎么处理都在这里

在开发中,有时,我们花了几个小时写的JS代码,在游览器调试一看,控制台一堆红,瞬间一万头草泥马奔腾而来。至此,本文主要记录JS常见的一些报错类型,以及常见的报错信息,分析其报错原因,并给予处理...

跨站脚本攻击(四)
跨站脚本攻击(四)

04XSS漏洞挖掘技巧4.1常见的绕过姿势实际应用中web程序往往会通过一些过滤规则来阻止带有恶意代码的用户输入被显示,但由于HTML语言的松散性和各种标签的不同优先级,使得我们绕过过滤规则成为了可能。4.1.1利用大小写绕过HTML标签...

2025-05-24 15:21 lipiwang

WAF-Bypass之SQL注入绕过思路总结

过WAF(针对云WAF)寻找真实IP(源站)绕过如果流量都没有经过WAF,WAF当然无法拦截攻击请求。当前多数云WAF架构,例如百度云加速、阿里云盾等,通过更改DNS解析,把流量引入WAF集群,流量经...

Springboot之登录模块探索(含Token,验证码,网络安全等知识)

简介登录模块很简单,前端发送账号密码的表单,后端接收验证后即可~淦!可是我想多了,于是有了以下几个问题(里面还包含网络安全问题):1.登录时的验证码2.自动登录的实现3.怎么维护前后端登录状态在这和大...

取消回复欢迎 发表评论: