一站式教你爬虫正则表达式(实战+全知识点)

张开发
2026/4/3 22:34:43 15 分钟阅读
一站式教你爬虫正则表达式(实战+全知识点)
正则表达式Regular Expression是一种用于匹配、查找、替换字符串的强大工具Python中的re模块是实现正则功能的核心库广泛应用于数据清洗、文本提取、格式校验等场景。本文将全面梳理re模块的核心知识点结合实战案例与代码块帮助快速掌握正则表达式的使用技巧兼顾理论与实操。一、re正则表达式核心知识点1. 正则表达式基础语法正则表达式的核心是“模式匹配”通过特殊字符元字符和普通字符组合定义匹配规则。以下是最常用的基础语法是后续实战的基础必须熟练掌握。1普通字符与元字符普通字符如字母a-z、A-Z、数字0-9、符号!、等直接匹配自身例如“abc”可匹配字符串中的“abc”。元字符具有特殊含义的字符是正则的核心常用元字符如下.匹配任意单个字符除换行符\n外例如“a.c”可匹配“abc”“acc”“a1c”等。****匹配字符串开头例如“abc”仅匹配以“abc”开头的字符串如“abc123”不匹配“xabc”。**∗∗匹配字符串结尾例如“abc**匹配字符串结尾例如“abc∗∗匹配字符串结尾例如“abc”仅匹配以“abc”结尾的字符串如“123abc”不匹配“abcx”。*****匹配前面的字符0次或多次例如“ab*c”可匹配“ac”“abc”“abbc”等。匹配前面的字符1次或多次例如“abc”可匹配“abc”“abbc”不匹配“ac”。?匹配前面的字符0次或1次例如“ab?c”可匹配“ac”“abc”不匹配“abbc”。{n}匹配前面的字符恰好n次例如“ab{2}c”仅匹配“abbc”。{n,}匹配前面的字符至少n次例如“ab{2,}c”可匹配“abbc”“abbbc”等。{n,m}匹配前面的字符n到m次包含n和m例如“ab{1,3}c”可匹配“abc”“abbc”“abbbc”。[]字符集匹配括号内的任意一个字符例如“[abc]”可匹配“a”“b”“c”支持范围如“[a-z]”匹配所有小写字母“[0-9]”匹配所有数字。**[]**否定字符集匹配括号外的任意一个字符例如“[abc]”匹配除“a”“b”“c”外的所有字符。***转义字符用于匹配元字符本身例如“.”匹配“.”“*”匹配“”同时也用于定义特殊序列如下。2常用特殊序列由“\”字母组成简化常用匹配规则提高编写效率\d匹配任意数字等价于“[0-9]”。\D匹配任意非数字等价于“[^0-9]”。\w匹配任意字母、数字、下划线等价于“[a-zA-Z0-9_]”。\W匹配任意非字母、数字、下划线等价于“[^a-zA-Z0-9_]”。\s匹配任意空白字符空格、制表符\t、换行符\n等。\S匹配任意非空白字符。\b匹配单词边界单词与非单词字符的分隔处例如“\babc\b”仅匹配独立的“abc”不匹配“abcde”或“xabc”。3分组与捕获用“()”将正则表达式的一部分括起来形成一个分组可实现批量匹配、提取指定内容常用场景普通分组“(ab)”匹配“ab”“abab”等分组内的内容可后续提取。非捕获分组“(?:ab)”仅匹配内容不捕获分组结果节省内存。分组引用用“\1”“\2”等引用前面的分组例如“(ab)(cd)\1\2”可匹配“abcdabcd”。4贪婪与非贪婪匹配正则默认是贪婪匹配尽可能多的匹配内容在元字符“*”“”“?”“{n,m}”后加“?”可转为非贪婪匹配尽可能少的匹配内容贪婪“a.*c”匹配“abcabc”时会匹配整个字符串从第一个a到最后一个c。非贪婪“a.*?c”匹配“abcabc”时会匹配“abc”和“abc”两个片段。2. Python re模块核心方法re模块提供了一系列方法用于实现正则匹配、查找、替换、分割等功能以下是最常用的6个方法覆盖绝大多数实战场景。1re.match()从字符串开头匹配语法re.match(pattern, string, flags0)仅从字符串的开头开始匹配若开头不匹配则返回None匹配成功返回Match对象。2re.search()全局匹配第一个符合规则的内容语法re.search(pattern, string, flags0)遍历整个字符串匹配第一个符合规则的内容返回Match对象若未匹配则返回None区别于match()不局限于开头。3re.findall()匹配所有符合规则的内容返回列表语法re.findall(pattern, string, flags0)遍历整个字符串将所有符合规则的内容提取出来返回一个列表若未匹配则返回空列表最常用的提取方法。4re.finditer()匹配所有符合规则的内容返回迭代器语法re.finditer(pattern, string, flags0)与findall()功能类似但返回的是Match对象的迭代器适合处理大量匹配结果节省内存。5re.sub()替换匹配到的内容语法re.sub(pattern, repl, string, count0, flags0)将字符串中匹配到的内容替换为replcount指定替换次数0表示全部替换返回替换后的字符串。6re.split()根据匹配规则分割字符串语法re.split(pattern, string, maxsplit0, flags0)根据匹配到的内容分割字符串maxsplit指定分割次数0表示全部分割返回分割后的列表。7flags参数常用用于控制匹配模式常用值re.Ire.IGNORECASE忽略大小写匹配。re.Sre.DOTALL让“.”匹配包括换行符\n在内的所有字符。re.Mre.MULTILINE让“^”“$”匹配每一行的开头和结尾而非整个字符串。二、re正则表达式实战案例附代码块以下实战案例覆盖数据提取、格式校验、文本清洗、分割替换等高频场景代码可直接复制运行结合知识点加深理解。实战1提取字符串中的所有数字基础提取需求从文本“订单编号20240520001金额99.9元数量5件”中提取所有数字包括整数和小数。importre text订单编号20240520001金额99.9元数量5件# 匹配整数和小数正则模式\d\.?\d*\d匹配1个以上数字\.?匹配0或1个小数点\d*匹配0个以上数字patternr\d\.?\d*resultre.findall(pattern,text)print(提取的数字,result)# 输出提取的数字[20240520001, 99.9, 5]实战2校验手机号格式格式校验需求校验手机号是否符合中国大陆规范11位数字以13、14、15、17、18、19开头。importredefcheck_phone(phone):# 正则模式^1[345789]\d{9}$^开头1[345789]匹配开头\d{9}匹配后续9位数字$结尾patternr^1[345789]\d{9}$ifre.match(pattern,phone):returnTrueelse:returnFalse# 测试print(check_phone(13812345678))# 输出Trueprint(check_phone(12345678901))# 输出False开头不符合print(check_phone(1381234567))# 输出False不足11位实战3提取邮箱地址复杂提取需求从文本“联系邮箱test123163.com备用邮箱abc_xyzqq.com无效邮箱test.com”中提取有效的邮箱地址。importre text联系邮箱test123163.com备用邮箱abc_xyzqq.com无效邮箱test.com# 邮箱正则模式\w([-.]\w)*\w([-.]\w)*\.\w([-.]\w)*# 解析匹配用户名含字母、数字、下划线、-.域名后缀patternr\w([-.]\w)*\w([-.]\w)*\.\w([-.]\w)*resultre.findall(pattern,text)# 提取匹配结果的完整内容findall匹配分组时需取第一个元素emails[match[0]match[2].match[4]ifmatchelseformatchinresult]# 简化写法直接匹配完整邮箱不分组pattern_simpler[a-zA-Z0-9_-][a-zA-Z0-9_-]\.[a-zA-Z0-9_-]emails_simplere.findall(pattern_simple,text)print(提取的有效邮箱,emails_simple)# 输出[test123163.com, abc_xyzqq.com]实战4文本清洗替换无效字符需求清洗文本“HelloWorld123Python_正则表达式”删除所有特殊符号只保留字母、数字、下划线和中文。importre textHelloWorld123Python_正则表达式# 匹配所有非字母、非数字、非下划线、非中文的字符替换为空字符串patternr[^\w\u4e00-\u9fa5]# \u4e00-\u9fa5匹配中文clean_textre.sub(pattern,,text)print(清洗后的文本,clean_text)# 输出HelloWorld123Python正则表达式实战5分割字符串复杂分割需求将文本“2024-05-20 14:30:00|Python|正则表达式”按“-”“:”“ ”“|”分割提取所有元素。importre text2024-05-20 14:30:00|Python|正则表达式# 匹配多个分隔符用[]包裹\s匹配空格patternr[-:\s|]resultre.split(pattern,text)print(分割结果,result)# 输出[2024, 05, 20, 14, 30, 00, Python, 正则表达式]实战6分组提取提取指定字段需求从日志文本“2024-05-20 14:30:00 [INFO] 用户admin登录成功”中提取时间、日志级别、用户信息。importre log2024-05-20 14:30:00 [INFO] 用户admin登录成功# 分组匹配分别捕获时间、日志级别、用户名patternr(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})\s\[(\w)\]\s用户(\w)登录成功matchre.search(pattern,log)ifmatch:timematch.group(1)# 第一个分组时间levelmatch.group(2)# 第二个分组日志级别usermatch.group(3)# 第三个分组用户名print(f时间{time}日志级别{level}用户{user})# 输出时间2024-05-20 14:30:00日志级别INFO用户admin三、实战注意事项正则表达式中元字符需要转义如“.”“*”“?”建议在pattern前加“r”原始字符串避免Python转义字符干扰如“\d”无需写成“\d”。贪婪与非贪婪匹配的选择提取内容时若需精准匹配如提取标签内的内容优先使用非贪婪匹配加“?”避免匹配范围过大。复杂正则可分步编写先匹配简单部分逐步完善例如邮箱匹配可先匹配“”前后的内容再优化细节。多匹配结果优先使用finditer()当匹配结果较多时finditer()返回迭代器比findall()更节省内存遍历迭代器即可获取每个Match对象。flags参数的合理使用忽略大小写用re.I匹配换行用re.S多行为匹配用re.M根据需求组合使用。四、总结本文全面梳理了re正则表达式的核心知识点包括基础语法、元字符、特殊序列、分组匹配以及re模块的常用方法结合6个高频实战案例覆盖了提取、校验、清洗、分割等常见场景代码简洁可复用。正则表达式的核心是“灵活组合匹配规则”实际使用中需根据具体需求设计pattern多练习、多调试才能熟练掌握。掌握本文内容可应对日常工作中80%以上的正则使用场景进一步深入可学习正则的高级特性如正向预查、反向预查。关注我每天学习一个逆向小知识点从新手成长为逆向高手

更多文章