当前位置: 首页 > news >正文

第7章 模式匹配与正则表达式

目录

  • 1. 不用正则表达式来查找文本模式
  • 2. 用正则表达式来查找文本模式
    • 2.1 创建正则表达式(Regex)对象
    • 2.2 匹配Regex对象
  • 3. 用正则表达式匹配更多模式
    • 3.1 利用括号分组
    • 3.2 用管道匹配多个分组
    • 3.3 用问号实现可选匹配
    • 3.4 用星号匹配零次或多次
    • 3.5 用加号匹配一次或多次
    • 3.6 用花括号匹配特定次数
  • 4. 贪心和非贪心匹配
  • 5. findall() 方法
  • 6. 字符分类
  • 7. 建立自己的字符分类
  • 8. 插入字符和美元字符
  • 9. 通配字符
    • 9.1 用点-星匹配所有字符
    • 9.2 用句点字符匹配换行符
  • 10. 不区分大小写的匹配
  • 11. 用 sub() 方法替换字符串

1. 不用正则表达式来查找文本模式

def isPhoneNumber(text):if len(text) != 11:return Falsefor i in range(0, len(text)):if (i == 3 or i == 7) and text[i] != "-":return Falseelif i != 3 and i != 7 and not text[i].isdecimal():return Falsereturn Truetext = "123-456-789"
print(text)
print(isPhoneNumber(text))

2. 用正则表达式来查找文本模式

2.1 创建正则表达式(Regex)对象

import retext = re.compile(r'\d\d\d-\d\d\d-\d\d\d')

2.2 匹配Regex对象

import retext = re.compile(r'\d\d\d-\d\d\d-\d\d\d')
match = text.search("~~~123-456-789~~~")
print(match.group())

3. 用正则表达式匹配更多模式

3.1 利用括号分组

import retext = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d)')
match = text.search("~~~123-456-789~~~")
print(match.group(1))
# 123
print(match.group(2))
# 456-789
print(match.groups())
# ('123', '456-789')

3.2 用管道匹配多个分组

  • | :管道
import retext = re.compile(r'456|123')
match = text.search("123-456-789")
print(match.group())
# 123

3.3 用问号实现可选匹配

import retext = re.compile(r'\d\d\d(~)?\d\d\d')
match = text.search("123123")
print(match.group())
# 123123match = text.search("123~123")
print(match.group())
# 123~123

3.4 用星号匹配零次或多次

import retext = re.compile(r'\d\d\d(~)*\d\d\d')
match = text.search("123123")
print(match.group())
# 123123match = text.search("123~~~123")
print(match.group())
# 123~~~123

3.5 用加号匹配一次或多次

import retext = re.compile(r'\d\d\d(~)+\d\d\d')
match = text.search("123~123")
print(match.group())
# 123~123match = text.search("123~~~123")
print(match.group())
# 123~~~123

3.6 用花括号匹配特定次数

import retext = re.compile(r'\d\d\d(~){3,5}\d\d\d')
match = text.search("123~~~123")
print(match.group())
# 123~~~123match = text.search("123~~~~~123")
print(match.group())
# 123~~~~~123

4. 贪心和非贪心匹配

  • 贪心匹配:尽可能匹配最长的字符串
  • 非贪心匹配:尽可能匹配最短的字符串
import retext = re.compile(r'(123 ){2,4}')
match = text.search("123 123 123 123 123 ")
print(match.group())
# 123 123 123 123text = re.compile(r'(123 ){2,4}?')
match = text.search("123 123 123 123 123 ")
print(match.group())
# 123 123

5. findall() 方法

import retext = re.compile(r'\d\d\d-\d\d\d-\d\d\d')
match = text.search("~~~123-456-789~~~111-222-333~~~")
print(match.group())
# 123-456-789match = text.findall("~~~123-456-789~~~111-222-333~~~")
print(match)
# ['123-456-789', '111-222-333']

6. 字符分类

编写字符分类表示
\d0~9的任何数字
\D除0~9的数字以外的任何字符
\w任何字母、数字和下划线字符
\W除字母、数字和下划线以外的任何字符
\s空格、制表符或换行符
\S除空格、制表符和换行符以外的任何字符

7. 建立自己的字符分类

import retext = re.compile(r'[0-5]')
match = text.findall("1a2b3c4d")
print(match)
# ['1', '2', '3', '4']text = re.compile(r'[abc]')
match = text.findall("1a2b3c4d")
print(match)
# ['a', 'b', 'c']text = re.compile(r'[^abc]')
match = text.findall("1a2b3c4d")
print(match)
# ['1', '2', '3', '4', 'd']

8. 插入字符和美元字符

  • ^ :以指定文本开始
  • $ :以指定文本结束
import retext = re.compile(r'^\d\d\d')
match = text.search("123abc456")
print(match)
# <re.Match object; span=(0, 3), match='123'>text = re.compile(r'\d\d\d$')
match = text.search("123abc456")
print(match)
# <re.Match object; span=(6, 9), match='456'>

9. 通配字符

  • . :匹配换行符之外的所有字符
import retext = re.compile(r'..23')
match = text.findall("123abc23")
print(match)
# ['bc23']

9.1 用点-星匹配所有字符

import retext = re.compile(r'123(.*)456(.*)')
match = text.findall("123abc456def")
print(match)
# [('abc', 'def')]

9.2 用句点字符匹配换行符

  • re.DOTALL :让句点字符匹配所有字符(包括换行符)
import retext = re.compile(r'.*')
match = text.search("123abc\n456def")
print(match.group())
# 123abctext = re.compile(r'.*', re.DOTALL)
match = text.search("123abc\n456def")
print(match.group())
# 123abc\n456def

10. 不区分大小写的匹配

  • re.I :不区分大小写
import retext = re.compile(r'abc', re.I)
match = text.findall("abcABC")
print(match)
# ['abc', 'ABC']

11. 用 sub() 方法替换字符串

import retext = re.compile(r'ABC\w*')
match = text.sub("abc", "ABC : 123")
print(match)
# abc : 123
http://www.lryc.cn/news/236290.html

相关文章:

  • 单元测试实战(三)JPA 的测试
  • 初刷leetcode题目(3)——数据结构与算法
  • 76基于matlab的免疫算法求解配送中心选址问题,根据配送地址确定最佳配送中心地址位置。
  • C++二分查找算法:找到 Alice 和 Bob 可以相遇的建筑
  • 建立跨层全栈的区块链安全保障系统-应用层,系统层,设施层
  • 程序员告诉你:人工智能是什么?
  • 飞书开发学习笔记(七)-添加机器人及发送webhook消息
  • C/C++统计数 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
  • 从一到无穷大 #19 TagTree,倒排索引入手是否是优化时序数据库查询的通用方案?
  • 程序员带你入门人工智能
  • 机器学习笔记 - 了解常见开源文本识别数据集以及了解如何创建用于文本识别的合成数据
  • openssl开发详解
  • conda虚拟环境中安装的cuda和服务器上安装的cuda的异同
  • 股东入股可用的出资形式主要有哪些
  • react中设置activeClassName的笔记
  • JS原型对象prototype
  • nodejs+vue实验室上机管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计
  • SpringBoot 注解开发
  • 使用持久卷部署 WordPress 和 MySQL
  • 2024年csdn最新最全的Postman接口测试: postman实现参数化
  • 开发知识点-uniapp微信小程序-开发指南
  • Vue3+Vite实现工程化,事件绑定以及修饰符
  • 20、动态路由_下滑线为前缀的目录
  • 中间件安全: Apache 远程代码执行 (CVE-2021-42013)
  • YOLOv8优化与量化(1000+ FPS性能)
  • python urllib open 头部信息错误
  • nn.KLDivLoss,nn.CrossEntropyLoss,nn.MSELoss,Focal_Loss
  • HTTP Error 500.31 - Failed to load ASP.NET Core runtime
  • 2023.11.17 关于 Spring Boot 日志文件
  • 【框架整合】Redis限流方案