Python正则表达式教程实战:字符串提取与数据清洗入门指南

admin python教程 21


是不是很多刚学 Python 的朋友都遇到过这种情况?爬了一堆数据,结果全是乱七八糟的字符串,手机号藏在句子里、邮箱混在一堆文字中,想提取出来得手动删半天;或者数据里有各种多余的空格、特殊符号,清洗起来特别费劲。这时候要是会用正则表达式,分分钟就能搞定!今天兔子哥就带大家学 Python 正则表达式,从基础用法到字符串提取、数据清洗实战案例,零基础也能跟着做,一起往下看吧!

先说说:Python 里的正则表达式,到底能帮我们做啥?


很多新手觉得正则表达式就是 “写一堆看不懂的符号”,其实在 Python 里它超实用,尤其是处理文本数据时:
  • 从大段文字里提取关键信息,比如手机号、邮箱、网址、日期
  • 快速清洗杂乱数据,比如去除多余空格、替换特殊符号、统一格式
  • 验证用户输入是否符合要求,比如检查手机号格式对不对、密码是否达标

做数据分析的小张分享:“以前处理用户评论数据,光提取里面的日期就用了十几行代码,学了正则后一行代码搞定,效率直接翻倍。” 所以不管你是做爬虫、数据分析还是开发,正则表达式都是必须掌握的技能。

基础准备:Python 正则模块 re,这几个函数必须会


Python 里处理正则表达式主要用re模块,不用额外安装,直接import re就能用。这几个核心函数一定要练熟,在线教程里也都是重点讲它们:

1. re.findall (pattern, string):提取所有匹配的内容


最常用的函数,能把所有符合规则的内容都找出来,返回一个列表。比如提取一段文字里的所有手机号:
python
import retext = "联系我:13800138000,备用电话13912345678"phone_pattern = r"1[3-9]\d{9}"  # 手机号规则phones = re.findall(phone_pattern, text)print(phones)  # 输出:['13800138000', '13912345678']

小张说他刚开始总记错函数名,把findall写成find_all,结果报错半天找不出原因,大家注意别犯这种低级错误哦。

2. re.sub (pattern, repl, string):替换匹配的内容


数据清洗必备,把符合规则的内容替换成新内容。比如去除文本里的多余空格:
python
text = "  这  里  有  很  多  空  格  "clean_text = re.sub(r"\s+", " ", text).strip()  # \s+匹配多个空格,替换成一个空格print(clean_text)  # 输出:"这里 有 很多 空格"

strip()是去掉首尾空格,和正则配合用效果更好。

3. re.match (pattern, string) 和 re.search (pattern, string):匹配单个内容


  • re.match:只从字符串开头匹配,开头不满足就返回 None
  • re.search:在整个字符串里找第一个匹配的内容

比如验证手机号是否正确:
python
phone = "13800138000"if re.match(r"^1[3-9]\d{9}$", phone):  # ^开头,$结尾,确保整个字符串都是手机号print("手机号格式正确")else:print("格式错误")

新手常搞混这两个函数,记住:match看开头,search找全局第一个,提取单个内容用search更靠谱。

实战一:字符串提取,从杂乱文本里精准 “抓” 信息


提取信息是正则最常用的场景,咱们拿几个经典案例练练,用在线 Python 编辑器就能实时跑代码。

案例 1:提取文本里的所有邮箱


邮箱格式一般是 “xxx@xxx.xxx”,规则用r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+",代码:
python
import retext = "我的邮箱是abc@qq.com,工作邮箱work.123@163.com,备用邮箱test-456@gmail.com"email_pattern = r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+"emails = re.findall(email_pattern, text)print(emails)  # 输出三个邮箱的列表

运行后就能把三个邮箱全提取出来,比手动复制粘贴快多了。

案例 2:从 HTML 代码里提取链接


爬网页时经常需要提取里的链接,规则匹配href="后面的内容:
python
html = '百度B站'url_pattern = r'href="(.*?)"'  # ()表示提取分组里的内容,.*?非贪婪匹配urls = re.findall(url_pattern, html)print(urls)  # 输出:['https://www.baidu.com', 'https://www.bilibili.com']

这里的.*?是 “非贪婪匹配”,能避免把两个链接当成一个匹配,新手一定要记住这个技巧!

实战二:数据清洗,让杂乱数据变整齐


爬来的数据往往不规整,有多余符号、空格、换行,用正则清洗特别高效。

案例 1:统一日期格式


数据里的日期可能有 “2023-10-05”“2023/10/05”“2023.10.05” 多种格式,统一成 “2023-10-05”:
python
import redates = ["2023-10-05", "2023/10/05", "2023.10.05", "2023年10月05日"]date_pattern = r"(\d{4})[-/./年](\d{2})[-/./月](\d{2})[日]?"  # 匹配各种分隔符for date in dates:# 用分组替换,把年、月、日提取出来,用-连接clean_date = re.sub(date_pattern, r"\1-\2-\3", date)print(clean_date)  # 输出全是2023-10-05格式

这里的\1 \2 \3对应前面的三个分组,这种分组替换在清洗时超好用。

案例 2:去除文本里的特殊符号和多余空格


比如处理用户评论,去掉表情符号、特殊符号,只留中文、英文和数字:
python
text = "这是一条评论!😊 里面有很多~~特殊符号,还有   多余的空格!!"# 匹配非中文、英文、数字、空格的字符,替换成空clean_text = re.sub(r"[^\u4e00-\u9fa5a-zA-Z0-9 ]", "", text)# 去除多余空格clean_text = re.sub(r"\s+", " ", clean_text).strip()print(clean_text)  # 输出:"这是一条评论 里面有很多 特殊符号 还有 多余的空格"

这样清洗后的数据,做分析或展示都更清爽。

避坑指南:Python 正则新手常踩的 5 个雷


兔子哥总结了自己学的时候犯过的错,帮你少走弯路:

1. 忘记加 r 前缀,导致转义错误


Python 字符串里\是转义符,正则里\d表示数字,但直接写"\d"会被 Python 解析成转义符,得加r前缀表示原始字符串:r"\d",不然会报错或匹配失败。这是新手最常犯的错,一定要记住!

2. 贪婪匹配导致提取内容过多


正则默认是贪婪匹配,比如r""匹配链接1链接2时,会从第一个匹配到最后一个>,把两个链接都包含进去。解决办法是用非贪婪匹配r"",加个?就会匹配到第一个>为止。

3. 没考虑边界情况,提取不完整


比如提取手机号时用r"1[3-9]\d{9}",但如果手机号后面紧跟着非数字(比如 “13800138000 - 工作”),会把 “13800138000” 完整提取出来;可要是写成r"1[3-9]\d{9}\b"\b是单词边界),反而可能漏提,所以简单场景不用加多余边界。

4. 规则太复杂,自己都看不懂


新手总想着写一个完美的规则覆盖所有情况,结果规则写得超长,回头自己都看不懂。建议从简单规则开始,能满足 80% 需求就行,复杂情况再逐步优化。

5. 不用在线工具测试,直接写代码


写正则规则前一定要先用在线工具(比如 Regex101 选 Python 模式)测试,确保规则能匹配想要的内容,再放到 Python 代码里,不然反复改代码调试很浪费时间。

自问自答:Python 正则学习常见问题


“正则规则记不住怎么办?” 不用死记!常用的规则(手机号、邮箱、日期)存成模板,需要时改改就行,用多了自然就记住了,兔子哥现在写复杂规则也得查参考。
“学正则需要数学好吗?” 完全不需要!正则靠的是逻辑思维,只要能理清 “要匹配什么内容,有什么规律”,就能写出规则,和数学好坏没关系。
“除了 re 模块,还有其他工具吗?” 有个re.compile()函数可以预编译规则,多次使用时更高效,比如批量处理数据时:
python
pattern = re.compile(r"1[3-9]\d{9}")  # 预编译phones1 = pattern.findall(text1)phones2 = pattern.findall(text2)  # 多次使用更高效

个人心得:多练真实数据,比背语法有用 10 倍


兔子哥学 Python 正则的最大体会是:别光看教程敲示例代码,一定要用真实数据练手。比如爬点新闻网页,试着提取里面的标题、日期、作者;或者找一份杂乱的 Excel 数据,用正则清洗成规整格式。
刚开始写规则肯定会出错,比如提取邮箱时漏了某些符号,清洗日期时格式不对,这时候别慌,用在线工具一步步调规则,看看哪里匹配错了,改几次就熟了。小张说得好:“第一次用正则提取订单号,改了 5 次规则才成功,但学会后再也不用手动整理了,值!”
希望这篇教程能帮你入门 Python 正则表达式,现在就找一段杂乱数据,试试用re.findall提取信息,用re.sub清洗格式,你会发现正则真的能省超多时间。记住,正则不难,多练就能掌握,加油!

标签: 正则表达式 '13800138000'

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~