python 正则表达式(Regular Expression)

  • 正则表达式基础

    • search():只返回第一个匹配的字符串
    • findall():将搜寻结果以列表方式返回
    import re  # 导入re正则表达式模块msg = "十步13466663478杀一人,千里不留15688889999"def parseString(content):"""解析字符串中是否含有手机号"""# 使用re.compile()建立Regex对象# # 手机号(共11位)第一位是1 第二位是3~9中选1位 \d表示数字 {}里面的数字代表精确匹配多少位数,{9)表示9个数字phoneRule = re.compile(r'1[3-9]\d{9}')# 搜寻对象,search()只传回第一个匹配的字符串phoneNum = phoneRule.search(msg)if phoneNum is not None:print(phoneNum.group())else:print('该字符串中不包含手机号!')def parseString2(content):"""解析字符串中是否含有手机号"""# 使用re.compile()建立Regex对象# # 手机号(共11位)第一位是1 第二位是3~9中选1位 \d表示数字 {}里面的数字代表精确匹配多少位数,{9)表示9个数字phoneRule = re.compile(r'1[3-9]\d{9}')# findall():返回匹配结果列表phoneNum_list = phoneRule.findall(msg)if phoneNum_list:print(phoneNum_list)else:print('该字符串中不包含手机号!')def parseString3(content):"""解析字符串中是否含有手机号"""# 省略re.compile()# re.findall(pattern, string, flags)# 手机号(共11位)第一位是1 第二位是3~9中选1位 \d表示数字 {}里面的数字代表精确匹配多少位数,{9)表示9个数字pattern = r'1[3-9]\d{9}'# findall():返回匹配结果列表phoneNum_list = re.findall(pattern=pattern, string=msg) # 用列表传回搜寻结果if phoneNum_list:print(phoneNum_list)else:print('该字符串中不包含手机号!')parseString(msg)  # 13466663478
    parseString2(msg)  # ['13466663478', '15688889999']
    parseString3(msg)  # ['13466663478', '15688889999']
    
  • 使用小括号分组

    # author:mlnt
    # createdate:2022/8/15
    import re  # 导入re正则表达式模块msg = "十步134-6666-3478杀一人,千里不留156-8888-9999""""
    我国使用的手机号码为11位数字,我们的手机号可以分为三段,都有不同的编码含义:
    前3位是网络识别号、4-7位是地区编码(HLR归属位置寄存器)、8-11位是用户号码(随机分配)
    """
    def parseString(content):"""解析字符串中是否含有手机号"""# re.findall(pattern, string, flags)# 手机号(共11位)第一位是1 第二位是3~9中选1位 \d表示数字 {}里面的数字代表精确匹配多少位数pattern = r'(1[3-9]\d)-(\d{4})-(\d{4})'# findall():返回匹配结果列表phoneNum_list = re.findall(pattern=pattern, string=msg)  # 用元组列表传回搜寻结果if phoneNum_list:print(phoneNum_list)else:print('该字符串中不包含手机号!')def parseString2(content):"""解析字符串中是否含有手机号"""# 使用re.compile()建立Regex对象# 手机号(共11位)第一位是1 第二位是3~9中选1位 \d表示数字 {}里面的数字代表精确匹配多少位数pattern = r'(1[3-9]\d)-(\d{4})-(\d{4})'# 搜寻对象,search()只传回第一个匹配的字符串phoneNum = re.search(pattern=pattern, string=msg)if phoneNum is not None:# 前3位是网络识别号、4-7位是地区编码(HLR归属位置寄存器)、8-11位是用户号码(随机分配)print(phoneNum.group())network_num, area_num, user_num = phoneNum.groups()print(f'网络识别号:{network_num}')print(f'地区编码:{area_num}')print(f'用户号码:{user_num}')else:print('该字符串中不包含手机号!')parseString(msg)  # [('134', '6666', '3478'), ('156', '8888', '9999')]
    parseString2(msg)
    # 134-6666-3478
    # 网络识别号:134
    # 地区编码:6666
    # 用户号码:3478
    
  • 使用管道|

    | --> pipe 管道,使用管道可以同时搜寻比对多个字符串

    # | --> pipe 管道,使用管道可以同时搜寻比对多个字符串
    import remsg = 'Jack and Maria are good friends. They always go to school together.'
    pattern = 'Tom|Jack'  # 搜寻Tom和Jack
    result = re.findall(pattern=pattern, string=msg)
    print(result)  # ['Jack']
    pattern = 'Mary|John|Jackson|Maria|Jack'
    result = re.findall(pattern=pattern, string=msg)
    print(result)  # ['Jack', 'Maria']
    
  • 多个分组的管道搜索

    # author:mlnt
    # createdate:2022/8/15
    import remsg = 'Jackson, Jacknason, Jacknion and Maria are good friends. They always go to gym together.'
    pattern = 'Jack(son|nason|nion|nice)'
    result = re.findall(pattern=pattern, string=msg)
    print(result)  # ['son', 'nason', 'nion']
    
  • 使用问号(?)做搜索

    正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。
    正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
    特殊字符:

    • $:匹配输入字符串的结尾位置
    • ():标记一个子表达式的开始和结束位置
    • *:匹配前面的子表达式0次或多次
    • +:匹配前面的子表达式1次或多次
    • .:匹配除换行符(\n)之外的任意单个字符
    • [:标记一个中括号表达式的开始
    • ?:匹配前面的子表达式0次或1次,或指明一个非贪婪限定符
    • \:将下一个字符标记为特殊字符、原义字符、向后引用或八进制转义符
    • ^:匹配输入字符串的开始位置。当该符号在方括号表达式中使用时,表示不接受该方括号中的字符集合
    • {:标记限定符表达式的开始
    • |:指明两项之间的一个选择
    # author:mlnt
    # createdate:2022/8/15
    """
    正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。
    正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
    特殊字符:
    - $:匹配输入字符串的结尾位置
    - ():标记一个子表达式的开始和结束位置
    - *:匹配前面的子表达式0次或多次
    - +:匹配前面的子表达式1次或多次
    - .:匹配除换行符(\n)之外的任意单个字符
    - [:标记一个中括号表达式的开始
    - ?:匹配前面的子表达式0次或1次,或指明一个非贪婪限定符
    - \:将下一个字符标记为特殊字符、原义字符、向后引用或八进制转义符
    - ^:匹配输入字符串的开始位置。当该符号在方括号表达式中使用时,表示不接受该方括号中的字符集合
    - {:标记限定符表达式的开始
    - |:指明两项之间的一个选择"""
    """
    在正则表达式中,若某些括号内的字符串或正则表达式可有可无,可以在后面加上?
    """import remsg = 'Jackson and Maria are good friends. They always go to gym together.'
    pattern = 'Jack((na)?son)'
    result = re.search(pattern=pattern, string=msg)
    print(result.group())  # Jackson
    
  • 使用星号(*)做搜索

    在正则表达式中,若某些字符串或正则表达式可出现0次到多次,可在后面加*

    # author:mlnt
    # createdate:2022/8/15
    """
    在正则表达式中,若某些字符串或正则表达式可出现0次到多次,可在后面加*
    """
    import remsg = 'Jackson, Jacknason, Jacknion, Jackkkkjjan, Jackken and Maria are good friends. They always go to gym together.'
    pattern = 'Jack((k)*)'
    result = re.search(pattern=pattern, string=msg)
    print(result.group())  # Jack
    
  • 使用加号(+)做搜索

    在正则表达式中,若某些字符或正则表达式可出现1次或多次,可在后面加+

    # author:mlnt
    # createdate:2022/8/15
    """
    在正则表达式中,若某些字符或正则表达式可出现1次或多次,可在后面加+
    """
    import remsg = 'Jackson, Jackckson, and Maria are good friends. They always go to gym together.'
    pattern = 'Jack((ck)+son)'
    result = re.search(pattern=pattern, string=msg)
    print(result.group())  # Jackckson
    
  • 搜索时忽略大小写

    搜寻时,若是在search()或findall()内增加迪桑参数re.I或re.IGNORECASE,搜寻时会忽略大小写

    # author:mlnt
    # createdate:2022/8/15
    """
    搜寻时,若是在search()或findall()内增加迪桑参数re.I或re.IGNORECASE,搜寻时会忽略大小写
    """import remsg = 'JACK and Maria are good friends. They always go to school together.'
    pattern = 'Tom|Jack'  # 搜寻Tom和Jack
    result = re.findall(pattern=pattern, string=msg, flags=re.IGNORECASE)
    print(result)  # ['JACK']
    pattern = 'Mary|John|Jackson|Maria|Jack'
    result = re.findall(pattern=pattern, string=msg, flags=re.I)
    print(result)  # ['JACK', 'Maria']
    
  • 正则表达式的特殊字符

    # author:mlnt
    # createdate:2022/8/15
    """
    特殊字符:
    \d: 0~9的整数数字
    \D:除了0~9以外的其他字符
    \s:空白、定位、Tab键、换行、换页字符
    \S:除空白、定位、Tab键、换行、换页字符以外的其他字符
    \w:数字、字母和下划线,[A-Za-z0-9_]
    \W:除数字、字母和下划线和[A-Za-z0-9_]以外的其他字符
    """
    import remsg = 'JACK, Jackson and Maria are good friends.'
    pattern = '\w+'  # 不限长度的数字、字母和下划线字符
    result = re.findall(pattern=pattern, string=msg, flags=re.IGNORECASE)
    print(result)  # ['JACK', 'Jackson', 'and', 'Maria', 'are', 'good', 'friends']pattern = 'Jack\w*'  # Jack开头,后接0或多个数字、字母和下划线
    result = re.findall(pattern=pattern, string=msg, flags=re.I)
    print(result)  # ['JACK', 'Jackson']msg2 = '2 tigers, 3 dogs, 5 pigs'
    pattern = '\d+\s\w+'
    result = re.findall(pattern=pattern, string=msg2, flags=re.I)
    print(result)  # ['2 tigers', '3 dogs', '5 pigs']"""
    字符分类:
    [a-z]:代表a-z的小写字符
    [A-Z]:代表A-Z的大写字符
    [aeiouAEIOU]:代表英文发音的元音字符
    [2-5]:代表2-5的数字
    在字符分类中,中括号内可以不加上”\“进行”.“、”?“、”*“、"(”、“)”等字符的转义
    """
    msg = 'JACK, Jackson and Maria are good friends.'
    pattern = '[aeiouAEIOU]'
    result = re.findall(pattern=pattern, string=msg, flags=re.IGNORECASE)
    print(result)
    # ['A', 'a', 'o', 'a', 'a', 'i', 'a', 'a', 'e', 'o', 'o', 'i', 'e']msg2 = '2 tigers, 3 dogs, 5. pigs'
    pattern = '[2-5.]'
    result = re.findall(pattern=pattern, string=msg2, flags=re.I)
    print(result)
    # ['2', '3', '5', '.']# 字符分类的^字符
    # 如果在中括号内加上^,表示搜寻除这些字符以外的所有字符
    msg = 'Jackson and Maria are good friends.'
    pattern = '[^aeiouAEIOU]'
    result = re.findall(pattern=pattern, string=msg, flags=re.IGNORECASE)
    print(result)
    # ['J', 'c', 'k', 's', 'n', ' ', 'n', 'd', ' ', 'M', 'r', ' ', 'r', ' ', 'g', 'd', ' ', 'f', 'r', 'n', 'd', 's', '.']
    msg2 = '2 tigers, 3 dogs, 5. pigs'
    pattern = '[^2-5.]'
    result = re.findall(pattern=pattern, string=msg2, flags=re.I)
    print(result)
    # [' ', 't', 'i', 'g', 'e', 'r', 's', ',', ' ', ' ', 'd', 'o', 'g', 's', ',', ' ', ' ', 'p', 'i', 'g', 's']# 正则表达式法的^字符
    # 在正则表达式起始位置加上^字符,表示正则表达式法的字符串必须出现在被搜寻字符串的起始位置
    msg = 'Jack and Maria are good friends.'
    msg2 = 'Mary and Jack are good friends.'
    pattern = '^Jack'
    result1 = re.findall(pattern=pattern, string=msg)
    result2 = re.findall(pattern=pattern, string=msg2)
    print(result1)  # ['Jack']
    print(result2)  # []# 正则表达式法的$字符
    # 正则表达式法的末端放置$字符时,表示正则表达式的字符串必须出现在被搜寻字符串的末尾
    msg = 'Generally speaking, both males and females are of age at 18.'
    pattern1 = '\W$'    # 以除英文字母、数字、下划线之外的其他字符结尾
    pattern2 = '\d$'    # 以数字结尾
    result1 = re.findall(pattern=pattern1, string=msg)
    result2 = re.findall(pattern=pattern2, string=msg2)
    print(result1)  # ['.']
    print(result2)  # []# 单一字符使用通配符“.”
    # 通配符“.”匹配除换行符以外的所有单个字符
    msg = 'Generally speaking, both males and females are of age at 18.'
    pattern = '.re'
    result = re.findall(pattern, msg)
    print(result) # ['are']# 所有字符使用通配符“.*”
    # .*:可以匹配所有字符,表示匹配0到多个通配符(换行符除外)
    msg = 'Name: Jack, Age: 18 Tel: 13838384438'
    pattern = 'Name: (.*) Age: (.*) Tel: (.*)'
    result = re.search(pattern=pattern, string=msg)
    name, age, tel = result.groups()
    print(f'Name: {name}, Age: {age}, Tel: {tel}')
    # Name: Jack,, Age: 18, Tel: 13838384438# 换行字符的处理
    # 用“.*”搜寻时,遇到换行字符“\n”则停止
    # re模块提供参数re.DOTALL,功能包括搜寻换行字符
    msg = 'Name: Jack, Age: 18 \nTel: 13838384438'
    pattern = '(.*)'
    result1 = re.search(pattern=pattern, string=msg)
    print(result1.group()) # Name: Jack, Age: 18
    result2 = re.search(pattern=pattern, string=msg, flags=re.DOTALL)
    print(result2.group())
    # Name: Jack, Age: 18
    # Tel: 13838384438
    
  • re.match()MatchObject对象内容的重要方法

    • re.match()只搜寻比对字符串开头,成功返回MatchObject对象,失败则返回None
    • group():返回搜寻到的字符串
    • end():返回搜寻到的字符串的结尾位置
    • start():返回搜寻到的字符串的起始位置
    • span():返回字符串的(起始,结束)位置
    # author:mlnt
    # createdate:2022/8/15
    """
    re.match()只搜寻比对字符串开头,成功返回MatchObject对象,失败则返回None
    re.search()搜寻整个字符串,成功返回MatchObject对象,失败则返回None
    """
    """
    MatchObject对象内容的重要方法:
    - group():返回搜寻到的字符串
    - end():返回搜寻到的字符串的结尾位置
    - start():返回搜寻到的字符串的起始位置
    - span():返回字符串的(起始,结束)位置
    """
    import remsg = 'Jack and Maria are good friends.'
    msg2 = 'Mary and Jack are good friends.'
    pattern = 'Jack'
    result1 = re.match(pattern=pattern, string=msg)
    if result1 is not None:print(result1.group())  # Jackprint(result1.start())  # 0print(result1.end())  # 4print(result1.span())  # (0, 4)
    result2 = re.match(pattern=pattern, string=msg2)
    if result2 is not None:print(result2.group())
    
  • sub()方法

    result = re.sub(pattern, newstr, msg)

    pattern是欲搜寻的字符串,如果搜寻成功,则用newstr替换,同时将结果传给result;如果搜寻到多个相同字符串,这些字符串都会被替换,原msg的内容不会改变;如果搜寻失败,则将msg内容赋值给result

    # author:mlnt
    # createdate:2022/8/15
    """
    sub()方法的语法:
    result = re.sub(pattern, newstr, msg)
    pattern是欲搜寻的字符串,如果搜寻成功,则用newstr替换,同时将结果传给result;
    如果搜寻到多个相同字符串,这些字符串都会被替换,原msg的内容不会改变;
    如果搜寻失败,则将msg内容赋值给result
    """
    import remsg = "十步13466663478杀一人,千里不留15688889999"
    pattern = r'(1[3-9]\d+)(\d{4})(\d{4})'
    newstr = r'\1****\3'  # 第2个分组用*替换
    result = re.sub(pattern=pattern, repl=newstr, string=msg)
    print(result)
    # 十步134****3478杀一人,千里不留156****9999
    
  • 电子邮箱地址的搜寻

    # author:mlnt
    # createdate:2022/8/15
    import re# 在正则表达式中加注释,需使用re.VERBOSE参数
    def get_mail(content):"""提取邮箱"""pattern = r"""([a-zA-Z0-9_-]+          # 用户账号@                       # @符号[a-zA-Z0-9]+            # 主机域名domain[\.]                    # .符号 [a-zA-Z]{2,4}           # com/edu或其他([\.])?                 # .符号([a-zA-Z]{2,4})?        # 国别)"""results = re.findall(pattern, content, re.VERBOSE)return resultscontent = 'test@163.com 998@gmail.com'
    print(get_mail(content))
    # [('test@163.com', '', ''), ('998@gmail.com', '', '')]
    

参考:

  • https://www.runoob.com/regexp/regexp-tutorial.html

python 正则表达式(Regular Expression)基础学习笔记相关推荐

  1. P4:正则表达式(Regular Expression)学习笔记

    正则表达式学习 1.初始正则表达式 1.1正则表达式练习1 1.2正则表达式练习2 1.3正则表达式练习3 2.正则表达式源码分析 2.1 源码分析-matcher.find() 2.2源码分析- m ...

  2. Python数据分析入门--Numpy基础学习笔记

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 NumPy基础 1.NumPy nadarray:多维数组对象 1.1ndarray及其数据类型 1.2NumPy数组 ...

  3. python正则表达式快速入门_Python学习笔记——正则表达式入门

    标签: # 本文对正则知识不做详细解释,仅作入门级的正则知识目录. 正则表达式的强大早有耳闻,大一时参加一次选拔考试,题目就是用做个HTML解析器,正则的优势表现得淋漓尽致.题外话不多讲,直接上干货: ...

  4. 【Python】DS的基础学习笔记7:文件、异常和模块

    文章目录 文件.异常和模块 7.1 文件的读写 7.1.1 文件的打开 1. 文件路径 2. 打开模式 3. 字符编码 7.1.2 文件的读取 1. 读取整个内容--f.read() 2. 逐行进行读 ...

  5. python ide安装_Python基础学习笔记(一)安装以及IDE的配置

    一.初识Python 版本:python-3.4.3.amd64 初次接触Python,没有使用Python 2.x进行开发真实项目的经历.所以不知2.x版本和3.x版本孰优孰劣,目前是作为一门兴趣来 ...

  6. 【Python】DS的基础学习笔记3:组合数据类型

    文章目录 组合数据类型 3.1 列表 3.1.1 列表的表达 3.1.2 列表的性质 3.1.3 列表的操作符 3.1.4 列表的操作方法 1 增加元素 2 删除元素 3 查找元素 4 修改元素 5 ...

  7. 【Python】DS的基础学习笔记2:基本数据类型

    文章目录 基本数据类型 2.1 数字类型 2.1.1 数字类型的组成 1 整数--不同进制的转换 2 浮点数--不确定性 3 复数--a+bj 2.1.2 数字运算操作符(a 操作符 b) 2.1.3 ...

  8. python 正则表达式判断字符串_python学习笔记|字符串与正则表达式

    总结一些字符串常用操作以及正则表达式相关 字符串基本操作 获取字符串长度 len(text) 字符串分割 word = text.split(" ") len(word) # 单词 ...

  9. Python基础学习笔记之(一)

    Python基础学习笔记之(一) zouxy09@qq.com http://blog.csdn.net/zouxy09 前段时间参加微软的windows Azure云计算的一个小培训,其中Pytho ...

最新文章

  1. mysql如何防止插入重复数据_防止MySQL重复插入数据的三种方法
  2. redis详解(四)-- 高可用分布式集群
  3. 让浏览器非阻塞加载javascript的几种方式
  4. numpy和str互转
  5. struts2-ognl 访问静态方法
  6. C++检查给定数字是否为4的幂的算法实现(附完整源码)
  7. Python中判断字符是否为字母、数字、字母和数字组合,验证回文串(LeetCode125)
  8. vue 调用mutation方法_Vuex白话教程第三讲:Vuex旗下的Mutation
  9. return在c语言中是什么意思
  10. android shape.xml 属性详解
  11. php判断是否存在http,php获取http-header来判断文件是否存在
  12. 据说集齐这些特点的智能硬件百分百“作死”
  13. Android开发之ListView中Adapter的优化
  14. 智钜科技解读:单轨,双轨,多轨,三三复制的区别
  15. 【精读AI论文】inceptionV2 BN-inception Batch Normalization BN 批量标准化
  16. 安装nginx,php8,nfs,oralce19c客户端
  17. android仿微信图片选择预览裁剪,仿微信图片选择
  18. 汇编总结:无符号除法,有符号除法,取余,无符号乘法,有符号乘法指令
  19. 高并发系统高可用设计方案(一)
  20. FlyFish 2.0已发布,大屏开发应用更加灵活便捷

热门文章

  1. 新浪页游助手,热门页游 全网覆盖
  2. MySQL存储过程批量插入数据
  3. sublimetext16 进制编辑模式_一个21岁在读本科生的开源编辑器火了!
  4. python用pip安装numpy错误_在Ubuntu上用pip安装NumPy失败了
  5. 联发科有没有高端处理器_没有高端也无妨 联发科12nm神U出货超过5000万
  6. 十个极品笑话 看完后我笑的跟哭似的
  7. IntelliJ IDEA 小贴士
  8. 饮料代理品牌的选择有多重要?新手应该如何选择?
  9. 【调剂】首都师范大学2023年硕士研究生调剂公告
  10. 与思考和励志的名言警句有哪些