Python 中的正则表达式全部用法速查

本文详细介绍了Python中正则表达式的语法和使用,包括正则表达式的特性、元字符、字符类别、Python的re模块及其API,还讨论了常见的正则表达式陷阱和最佳实践,帮助开发者深入理解和高效使用Python正则。
摘要由CSDN通过智能技术生成

正则表达式

正则语法

特性

  • 正则表达式可以拼接,如果A和B都是正则表达式,那么 AB也是正则表达式.如果字符串p匹配A并且另一个字符串q匹配B, 那么pq可以匹配 AB.这就构成了由简单构建复杂的基础.除非:
    • A或者B包含低优先级操作
    • A和B存在边界条件
    • 存在命名组引用。

字符

元字符 : 特殊字符

它们不匹配自己,在正则中具有其它的意义,匹配自己需要转义.

元字符的完整列表:

基础字符
字符 功能
\ 转义
[ ] 匹配一类单个字符,在里面的字符除了[- ^ \s \S \d \D \w \W] 都是普通字符
() 分组.与数学中括号的作用大致相同.将括号内的内容视作一个独立字符或部分.
零宽度断言

它们不用来代表字符,用来实现一些特殊的匹配功能

字符 功能
| “or”运算符,优先级非常低.存在短路现象
^ [ ]内字符集的取反,或写在模式开头,代表以模式开头.MULTILINE 模式中,可以匹配在换行符之后的字符串内的任何位置。
$ 写在模式结尾,代表以模式结尾.只有\n在结尾也算匹配成功
\A 不在 MULTILINE 模式时,和 ^ 相同.MULTILINE 模式中,\A 仍然只在字符串开头匹配
\Z 只匹配字符串尾
\b 匹配完整单词,前后都是非字母数字字符:r'\bclass\b'.必须使用r'',因为Python会把\b解析为退格
\B 不在字边界时才匹配
\number 匹配数字代表的组合
重复限定
  • 它们不能直接嵌套使用,避免了非贪婪后缀 ? 修饰符,和其他实现中的修饰符产生的多义性
  • 可以使用括号包围再进行嵌套
字符 功能
. 匹配一个任意字符一次,是否包括换行符取决于DOTALL参数
{m,n} 匹配前一个字符的出现次数范围, m<=出现次数<=n. 可以缺省其中一个,视为0或无上限
{m} 匹配前一个字符的m个重复,少于 m 的话就会导致匹配失败
* {0,} 它的匹配是 贪婪的,先尽可能多地匹配,不成功再回退.
+ {1,}
? {0,1}, 代表一个可选字符.还可做非贪婪后缀修饰符
一类单个字符
语法 含义 同义替换
[abc] a 或 b 或 c a|b|c
[a-z] a-z 所有字符
[^5] 除了5所有的字符
\d 数字 [0-9]
\D 非数字 [^0-9]
\s 空白符 [\t\n\r\f\v]
\S 非空白符 [^ \t\n\r\f\v]
\w 大小写字母与数字 [a-zA-Z0-9_ ]
\W 非字母与数字 [^a-zA-Z0-9_ ]

Python 中的正则 – re 模块

参考链接

Python re模块 官方文档

Python 正则入门 官方教程

特性

  • 模式和被搜索的字符串既可以是 Unicode 字符串str ,也可以是8位字节串bytes.但不能混用.
  • 反斜杠灾难: python字符串中和正则中 / 都是转义字符,所以需要二次转义.正则中一个 ‘/’ 在字符串中就会写成 ‘’.解决方法是尽量使用 Python 的原始字符串表示法,在字符串前加 r ,例如: r’/'
  • 第三方模块regex, 提供了与标准库re模块兼容的API接口, 同时还提供了额外的功能和更全面的Unicode支持
  • 正则表达式模式被编译成一系列字节码,然后由用 C 编写的匹配引擎执行.
  • 适当选择代码和正则: 虽然 Python 代码比精心设计的正则表达式慢,但它也可能更容易理解.
  • 是Python附带的C扩展模块

API

编译正则
import re
p = re.compile('ab*')

//还可以接受一个可选的flag参数,用于启用各种特殊功能和语法变体
re.compile('ab*',re.IGNORECASE)
编译标志(选项)
标志(前加 re.) 缩写 含义
ASCII A 使几个转义如 \w\b\s\d 仅与具有相应的 ASCII 字符匹配而不是完整匹配Unicode
DOTALL S 使 . 匹配任何字符,包括换行符,否则不包括换行符
IGNORECASE I 忽略大小写
LOCALE L 进行区域设置感知匹配,应用于考虑到语言差异的程序
MULTILINE M 多行匹配,将每行(以换行符为分割)视作单独的字符串.
VERBOSE X 忽略正则中不在字符类里的空格将被忽略.使用户可以使用**空格,缩进,注释(#)**美化正则的格式
DEBUG 显示编译时的debug信息
# VERBOSE
pat = re.compile(r"""
 \s*                 # Skip leading whitespace
 (?P<header>[^:]+)   # Header name
 \s* :               # Whitespace, and a colon
 (?P<value>.*?)      # The header's value -- *? used to
                     # lose the following trailing whitespace
 \s*$                # Trailing whitespace to end-of-line
""", re.VERBOSE)
匹配方法
正则对象的方法和属性
方法/属性 - 正则编译后的对象.方法名() 功能
match('字符串'[,起始位置[,结束位置]]) 从字符串开头开始匹配,返回匹配对象
search('字符串'[,起始位置[,结束位置]]) 找到第一个匹配成功的子字符串,返回匹配对象
findall('字符串'[,起始位置[,结束位置]]) 找到并用列表返回所有匹配的子字符串
finditer('字符串'[,起始位置[,结束位置]]) 找到并返回所有匹配成功的匹配对象的iterator
fullmatch('字符串'[,起始位置[,结束位置]]) 对被查找串的完整匹配,相当于加了[^…$],返回匹配对象
split('字符串',最大分割数=0) 在正则匹配的所有地方将其拆分为列表.默认分割所有.就地
sub('表达式','字符串',替换次数=0) 替换匹配到的位置,默认替换所有.就地
subn('表达式','字符串',替换次数=0) sub() 相同,但返回新字符串和替换次数.就地
flags 标记 参数 选项
groups 捕获组合的数量
groupindex 命名捕获组的字典,如果没有命名捕获组则字典为空
pattern 编译对象的原始样式字符串
模块的顶级方法
  • 顶级函数允许同时传入正则表达式和要匹配的字符串,返回值和re.compile下方法的返回值相同

  • 但是如果需要多次匹配,且正则表达式相同,则会进行很多次不必要的编译

  • 每个函数还能在后面传入一个可选的标志参数,只能有一个标志

方法/属性 - re.方法名() 功能
match('表达式','字符串',标志) 从字符串开头开始匹配,返回匹配对象
search('表达式','字符串',标志)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值