Python正则表达式的应用详解

目录
  • 正则表达式的定义
  • Python对正则表达式的支持
    • 示例
      • 例1:验证输入的用户名是否有效,用户名由长度为6到20的字母、数字、下划线组成
      • 例2:从字符串中找到与正则表达式匹配的部分
      • 例3:从网页上获取新闻的标题和链接
      • 例4:不良内容过滤
      • 例5:用正则表达式拆分字符串
  • 总结

正则表达式的定义

在编写处理字符串的程时,经常会遇到在一段文本中查找符合某些规则的字符串的需求,正则表达式就是用于描述这些规则的工具,换句话说,我们可以使用正则表达式来定义字符串的匹配模式,即如何检查一个字符串是否有跟某种模式匹配的部分或者从一个字符串中将与模式匹配的部分提取出来或者替换掉。

关于正则表达式的相关知识,大家可以阅读一篇非常有名的博文叫《正则表达式30分钟入门教程》,读完这篇文章后你就可以看懂下面的表格,这是我们对正则表达式中的一些基本符号进行的扼要总结。

符号 解释 示例 说明
. 匹配除换行符以外的任意字符 b.t 可以匹配bat / but / b#t / b1t等
\w 匹配字母/数字/下划线/汉字 b\wt 可以匹配bat / b1t / b_t等,但不能匹配b#t
\s 匹配空白字符(包括\r、\n、\t等) love\syou 可以匹配love you
\d 匹配数字 \d\d 可以匹配01 / 23 / 99等
\b 匹配单词的边界 \bThe\b
^ 匹配字符串的开始 ^The 可以匹配The开头的字符串
$ 匹配字符串的结束 .exe$ 可以匹配.exe结尾的字符串
\W 匹配非字母/数字/下划线/汉字 b\Wt 可以匹配b#t / b@t等
但不能匹配but / b1t / b_t等
\S 匹配非空白字符 love\Syou 可以匹配love#you等
但不能匹配love you
\D 匹配非数字 \d\D 可以匹配9a / 3# / 0F等
\B 匹配非单词边界 \Bio\B
[] 匹配来自字符集的任意单一字符 [aeiou] 可以匹配任一元音字母字符
[^] 匹配不在字符集中的任意单一字符 [^aeiou] 可以匹配任一非元音字母字符
* 匹配0次或多次 \w*
+ 匹配1次或多次 \w+
? 匹配0次或1次 \w?
{N} 匹配N次 \w{3}
{M,} 匹配至少M次 \w{3,}
{M,N} 匹配至少M次至多N次 \w{3,6}
| 分支 foo|bar 可以匹配foo或者bar
(?#) 注释
(exp) 匹配exp并捕获到自动命名的组中
(?<name>exp) 匹配exp并捕获到名为name的组中
(?:exp) 匹配exp但是不捕获匹配的文本
(?=exp) 匹配exp前面的位置 \b\w+(?=ing) 可以匹配I'm dancing中的danc
(?<=exp) 匹配exp后面的位置 (?<=\bdanc)\w+\b 可以匹配I love dancing and reading中的第一个ing
(?!exp) 匹配后面不是exp的位置
(?<!exp) 匹配前面不是exp的位置
*? 重复任意次,但尽可能少重复 a.*b
a.*?b
将正则表达式应用于aabab,前者会匹配整个字符串aabab,后者会匹配aab和ab两个字符串
+? 重复1次或多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{M,N}? 重复M到N次,但尽可能少重复
{M,}? 重复M次以上,但尽可能少重复

说明: 如果需要匹配的字符是正则表达式中的特殊字符,那么可以使用\进行转义处理,例如想匹配小数点可以写成\.就可以了,因为直接写.会匹配任意字符;同理,想匹配圆括号必须写成\(和\),否则圆括号被视为正则表达式中的分组。

Python对正则表达式的支持

Python提供了re模块来支持正则表达式相关操作,下面是re模块中的核心函数。

函数 说明
compile(pattern, flags=0) 编译正则表达式返回正则表达式对象
match(pattern, string, flags=0) 用正则表达式匹配字符串 成功返回匹配对象 否则返回None
search(pattern, string, flags=0) 搜索字符串中第一次出现正则表达式的模式 成功返回匹配对象 否则返回None
split(pattern, string, maxsplit=0, flags=0) 用正则表达式指定的模式分隔符拆分字符串 返回列表
sub(pattern, repl, string, count=0, flags=0) 用指定的字符串替换原字符串中与正则表达式匹配的模式 可以用count指定替换的次数
fullmatch(pattern, string, flags=0) match函数的完全匹配(从字符串开头到结尾)版本
findall(pattern, string, flags=0) 查找字符串所有与正则表达式匹配的模式 返回字符串的列表
finditer(pattern, string, flags=0) 查找字符串所有与正则表达式匹配的模式 返回一个迭代器
purge() 清除隐式编译的正则表达式的缓存
re.I / re.IGNORECASE 忽略大小写匹配标记
re.M / re.MULTILINE 多行匹配标记

说明: 上面提到的re模块中的这些函数,实际开发中也可以用正则表达式对象的方法替代对这些函数的使用,如果一个正则表达式需要重复的使用,那么先通过compile函数编译正则表达式并创建出正则表达式对象无疑是更为明智的选择。

示例

例1:验证输入的用户名是否有效,用户名由长度为6到20的字母、数字、下划线组成

方法一:通过compile编译正则表达式创建Pattern对象,通过给Pattern对象发消息实现匹配检查。

import re

username = input('请输入用户名:')
# 通过compile编译正则表达式创建Pattern对象
username_pattern = re.compile(r'^\w{6,20}$')
print(type(username_pattern))
# 通过给Pattern对象发消息实现匹配检查
matcher = username_pattern.match(username)
print(type(matcher))
if matcher is None:
    print('无效的用户名')
else:
    print(matcher.group())

方法二:不创建正则表达式对象,直接调用函数进行匹配操作

username = input('请输入用户名:')
matcher = re.fullmatch(r'\w{6,20}', username)
#^是开始符,$是结束符
# matcher = re.match(r'^\w{6,20}$', username)
if matcher is None:
    print('用户名不合法!!!')
else:
    print(matcher)
    print(matcher.group())

匹配操作可以使用match函数,需要添加开始符号^和结束符号$表示匹配字符串的开始与结束;也可以使用fullmatch函数,正则表达式不用写开始符和结束符。上面在书写正则表达式时使用了“原始字符串”的写法。

例2:从字符串中找到与正则表达式匹配的部分

import re

content = """报警电话:110,我们班是Python-2105班,
我的QQ是9597658,我的手机号是13811223344,谢谢!"""

searcher = re.search(r'1[3-9]\d{9}', content)
if not searcher:
    print('没有找到手机号')
else:
    print(searcher.group())

匹配结果:

13811223344

import re

content = """报警电话:110,我们班是Python-2105班,
我的QQ是9597658,我的手机号是13811223344,谢谢!"""

pattern = re.compile(r'\d+')
matcher = pattern.search(content)
while matcher:
    print(matcher.group())
    # 从上一次匹配成功的结束位置开始搜索
    matcher = pattern.search(content, matcher.end())

匹配结果:

110
2105
9597658
13811223344

import re

content = """报警电话:110,我们班是Python-2105班,
我的QQ是9597658,我的手机号是13811223344,谢谢!"""

pattern = re.compile(r'\d+')
results = pattern.findall(content)
# 没有创建正则表达式对象时,也可以用这种方法
# results = re.findall(r'\d+', content)
for result in results:
    print(result)

匹配结果:

110
2105
9597658
13811223344

例3:从网页上获取新闻的标题和链接

import re

import requests

resp = requests.get('https://www.sohu.com/')
# .表示任意字符,+表示匹配一个或任意多个,?表示惰性匹配,尽可能短的匹配
pattern = re.compile(r'href="http.+?"')
# 拿到搜狐首页
content = resp.text
matcher = pattern.search(content)
while matcher:
    print(matcher.group()[6:-1])
    matcher = pattern.search(content, matcher.end())

pattern2 = re.compile(r'title=".+?"')
title_list = pattern2.findall(content)
for title in title_list:
    print(title[7:-1])

对于例3,不能使新闻的标题和链接对应起来,如果使用正则表达式捕获组,可以实现标题和链接的对应。

import re

import requests

resp = requests.get('https://www.sohu.com/')
# 匹配整个a标签,但是只捕获()中的内容 ---> 正则表达式的捕获组
# .*连在一起就意味着任意数量的不包含换行的字符
pattern = re.compile(r'<a\s.*?href="(.+?)".*?title="(.+?)".*?>')
content = resp.text
results = pattern.findall(content)
for href, title in results:
    print(title)
    if not href.startswith('https://www.sohu.com'):
        href = 'https://www.sohu.com' + href
    print(href)

例4:不良内容过滤

import re

content = '你真是一个沙雕煞笔,Fuck you!'
# pattern = re.compile(r'[傻沙煞][逼笔雕鄙]|马化腾|fuck|shit', flags=re.IGNORECASE)
# modified_content = pattern.sub('*', content)
# print(modified_content)
# |表示分支
modified_content = re.sub(r'[傻沙煞][逼笔雕鄙]|fuck|shit', '*', content, flags=re.I)
print(modified_content)

例5:用正则表达式拆分字符串

import re

poem = '床前明月光,疑是地上霜,举头望明月,低头思故乡。'
# sentences_list = re.split(r'[,。]', poem)
# sentences_list = re.split(r',|。', poem)
pattern = re.compile(r'[,。]')
sentences_list = pattern.split(poem)
# sentences_list = [sentence for sentence in sentences_list if sentence]
# print(sentences_list)
for sentence in sentences_list:
    print(sentence)

运行结果:

床前明月光
疑是地上霜
举头望明月
低头思故乡

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • python正则表达式re.search()的基本使用教程

    1 re.search() 的作用: re.search会匹配整个字符串,并返回第一个成功的匹配.如果匹配失败,则返回None 从源码里面可以看到re.search()方法里面有3个参数 pattern: 匹配的规则, string : 要匹配的内容, flags 标志位 这个是可选的,就是可以不写,可以写, 比如要忽略字符的大小写就可以使用标志位 flags 的主要内容如下 flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为: re.I 忽略大小写 re.L 表示特殊字

  • 一篇文章带你了解python正则表达式的正确用法

    目录 正则表达式的介绍 re模块 匹配单个字符 1.匹配任意一个字符 2.匹配[ ]中列举的字符 3.\d匹配数字,即0-9 4.\D匹配非数字,即不是数字 5.\s匹配空白,即 空格,tab键 6.\S匹配非空白 7.\w匹配非特殊字符,即a-z.A-Z.0-9._.汉字 8.\W匹配特殊字符,即非字母.非数字.非汉字 总结 正则表达式的介绍 1)在实际开发过程中经常会有查找符合某些复杂规则的字符串的需要,比如:邮箱.手机号码等,这时候想匹配或者查找符合某些规则的字符串就可以使用正则表达式了.

  • Python如何利用正则表达式爬取网页信息及图片

    一.正则表达式是什么? 概念: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑. 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. 个人理解: 简单来说就是使用正则表达式来写一个过滤器来过滤了掉杂乱的无用的信息(eg:网页源代码-)从中来获取自己想要的内容 二.实战项目 1.爬取内容 获取上海所有三甲医院的名称并保

  • 浅谈Python中的正则表达式

    Python里的正则表达式 Python里的正则表达式,无需下载外部模块,只需要引入自带模块:re: import re 官方re模块文档: https://docs.python.org/zh-cn/3.9/library/re.html 同时,Python的正则表达式是PCRE标准的,相较于广泛应用在Unix上的POSIX标准,还是有些区别的(主要是简化) 基本方法 观察re源码,其主要的接口方法有: match(-):从字符串的起始位置匹配一个模式,如果无法匹配成功,则match()就返回

  • python通过re正则表达式切割中英文的操作

    我就废话不多说了,大家还是直接看代码吧~ import re s = 'alibaba阿里巴巴' # 待分割字符串 en_letter = '[\u0041-\u005a|\u0061-\u007a]+' # 大小写英文字母 zh_char = '[\u4e00-\u9fa5]+' # 中文字符 print(re.findall(zh_char,s) + re.findall(en_letter,s)) # 输出: ['阿里巴巴', 'alibaba'] 范围 说明 \u4e00-\u9fa5

  • Python正则表达式re模块详解(建议收藏!)

    目录 前言 match 匹配字符串 单字符匹配 . 匹配任意一个字符 \d 匹配数字 \D 匹配非数字 \S 匹配非空白 \w 匹配单词.字符,如大小写字母,数字,_ 下划线 \W 匹配非单词字符 [ ] 匹配[ ]中列举的字符 表示数量 * 出现0次或无数次 + 至少出现一次 ? 1次或则0次 {m,} 至少出现m次 匹配边界 $ 匹配结尾字符 ^ 匹配开头字符 \b 匹配一个单词的边界 \B 匹配非单词边界 匹配分组 | 匹配左右任意一个表达式 (ab) 将括号中字符作为一个分组 searc

  • Python正则表达式和元字符详解

    正则表达式 正则表达式是一种强大的字符串操作工具.它是一种领域特定语言 (DSL),不管是 Python 还是在大多数现代编程语言中都是作为库存在. 它们主要面向两种任务: - 验证字符串是否与模式匹配 (例如,字符串具有电子邮件地址的格式). - 在字符串中执行替换(例如将所有大写字母改成小写字母). 特定于领域的语言是高度专业化的迷你编程语言. 正则表达式是一个例子,SQL(用于数据库操作)是另一个例子. 私有领域特定语言通常用于特定的工业目的. Python 的正则表达式可以使用 re 模

  • Python正则表达式的应用详解

    目录 正则表达式的定义 Python对正则表达式的支持 示例 例1:验证输入的用户名是否有效,用户名由长度为6到20的字母.数字.下划线组成 例2:从字符串中找到与正则表达式匹配的部分 例3:从网页上获取新闻的标题和链接 例4:不良内容过滤 例5:用正则表达式拆分字符串 总结 正则表达式的定义 在编写处理字符串的程时,经常会遇到在一段文本中查找符合某些规则的字符串的需求,正则表达式就是用于描述这些规则的工具,换句话说,我们可以使用正则表达式来定义字符串的匹配模式,即如何检查一个字符串是否有跟某种

  • python正则表达式re模块详解

    快速入门 import re pattern = 'this' text = 'Does this text match the pattern?' match = re.search(pattern, text) s = match.start() e = match.end() print('Found "{0}"\nin "{1}"'.format(match.re.pattern, match.string)) print('from {0} to {1}

  • Python常用的正则表达式处理函数详解

    正则表达式是一个特殊的字符序列,用于简洁表达一组字符串特征,检查一个字符串是否与某种模式匹配,使用起来十分方便. 在Python中,我们通过调用re库来使用re模块: import re 正则表达式语法模式和操作符详见:https://www.runoob.com/python/python-reg-expressions.html#flags 下面介绍Python常用的正则表达式处理函数. re.match函数 re.match 函数从字符串的起始位置匹配正则表达式,返回match对象,如果不

  • Python语法学习之正则表达式的使用详解

    目录 正则表达式中的特殊字符 正则表达式的使用 正则小案例 - 1 正则小案例 - 2 正则小案例 - 3 要想成功的进行字符串的匹配需要使用到正则表达式模块,正则表达式匹配规则以及需要被匹配的字符串.在这三个条件中,模块与字符串都是准备好的,只有匹配规则异常的灵活,而今天这个章节就是认识一下正则表达式中的特殊字符,通过这些字符就可以针对我们想要的数据进行匹配. 正则表达式中的特殊字符 特殊字符 描述 \d 匹配任何十进制的数字,与[0-9]一致 \D 匹配任意非数字 \w 匹配任何字母数字下划

  • Python字符串处理实例详解

    Python字符串处理实例详解 一.拆分含有多种分隔符的字符串 1.如何拆分含有多种分隔符的字符串 问题: 我们要把某个字符串依据分隔符号拆分不同的字段,该字符串包含多种不同的分隔符,例如: s = "ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz" 其中;,|,\t 都是分隔符号,如何处理? 方法一: 连续使用str.split()方法,每次处理一种分隔符号 s = "ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz&q

  • Python获取网页数据详解流程

    Requests 库是 Python 中发起 HTTP 请求的库,使用非常方便简单. 发送 GET 请求 当我们用浏览器打开东旭蓝天股票首页时,发送的最原始的请求就是 GET 请求,并传入url参数. import requests url='http://push2his.eastmoney.com/api/qt/stock/fflow/daykline/get' 用Python requests库的get函数得到数据并设置requests的请求头. header={ 'User-Agent'

  • Python中BeautifulSoup模块详解

    目录 前言 安装库 导入库 解析文档示例 提取数据示例 CSS选择器 实例小项目 总结 前言 BeautifulSoup是主要以解析web网页的Python模块,它会提供一些强大的解释器,以解析网页,然后提供一些函数,从页面中提取所需要的数据,目前是Python爬虫中最常用的模块之一. 安装库 在使用前需要安装库,这里建议安装bs4,也就是第四版本,因为根据官方文档第三版的已经停止更新.同时安装lxml解释器 pip3 install bs4 pip3 install lxml 导入库 from

  • 关于日期正则表达式的思路详解

    1        概述 首先需要说明的一点,无论是Winform,还是Webform,都有很成熟的日历控件,无论从易用性还是可扩展性上看,日期的选择和校验还是用日历控件来实现比较好. 前几天在CSDN多个版块看到需要日期正则的帖子,所以整理了这篇文章,和大家一起讨论交流,如有遗漏或错误的地方,还请大家指正. 日期正则一般是对格式有要求,且数据不是直接由用户输入时使用.因应用场景的不同,写出的正则也不同,复杂程度也自然不同.正则的书写需要根据具体情况具体分析,一个基本原则就是:只写合适的,不写复杂

随机推荐