python正则表达式详解

1.正则表达式符号

匹配零次或一次前面的分组
*匹配零次或多次前面的分组
+匹配一次或多次前面的分组
{n}匹配 n 次前面的分组
{n,}匹配 n 次或更多前面的分组
{,m}匹配零次到 m 次前面的分组
{n,m}匹配至少 n 次、至多 m 次前面的分组
{n,m}? 或 *? 或 +?对前面的分组进行非贪心匹配
^spam意味着字符串必须以 spam 开始
spam$意味着字符串必须以 spam 结束
.匹配所有字符,换行符除外
\d \w \s分别匹配数字、单词和空格
\D \W \S分别匹配出数字、单词和空格外的所有字符
[abc]匹配方括号内的任意字符(诸如 a、 b 或 c)
[^abc]匹配不在方括号内的任意字符

2.创建正则表达式对象

python中所有正则表达式的函数都在re模块中。

import re

2.1 正则表达式匹配步骤:

  1. import re 导入正则表达式模块
  2. 用re.compile()函数创建一个Regex对象(使用原始字符串)
  3. 向 Regex 对象的 search()方法传入想查找的字符串。它返回一个 Match 对象
  4. 调用 Match 对象的 group()方法,返回实际匹配文本的字符串
#!/usr/bin/python3
import re
hero=re.compile(r'Batman')
mo=hero.search('Batman and Tina')
mo.group()
管道符可以匹配许多表达式中的一个

第一次出现匹配文本,将作为Match对象返回
search()返回的 Match 对象只包含第一次出现的匹配文本
使用 findall() 方法,包含被查找字符串中的所有匹配

#!/usr/bin/python3
import re
hero = re.compile(r'Batman | Tina')
mo = hero.search('Batman and Tina Fey')
print(mo.group())
print(hero.findall('Batman and Tina Fey'))

在这里插入图片描述

表明它前面的分组是可选的
#!/usr/bin/python3
import re
bat = re.compile(r'Bat(wo)?man')
mo = bat.search('The Adventures of Batman')
print(mo.group())
mo1 = bat.search('The Adventures of Batwoman')
print(mo1.group())

在这里插入图片描述
用花括号匹配特定次数,也可以不写花括号中的第一个或第二个数字,不限定最小值或最大值

#!/usr/bin/python3
import re
ha = re.compile(r'(Ha){3}')
mo = ha.search('HaHaHa')
print(mo.group())

在这里插入图片描述

2.2 贪心和非贪心匹配

python的正则表达式默认是“贪心”的,这表示在有二义的情况下,它们会尽可能匹配最长的字符串。花括号的“非贪心”版本匹配尽可能最短的字符串,即在结束的花括号后跟着一个问号

#!/usr/bin/python3
import re
ha = re.compile(r'(Ha){3,5}')
mo = ha.search('HaHaHaHaHa')
print(mo.group())
ha1 = re.compile(r'(Ha){3,5}?')
mo1 = ha1.search('HaHaHaHaHa')
print(mo1.group())

在这里插入图片描述

2.3 建立自己的字符分类

可以使用短横表示字母或数字的范围,左方括号后加上一个插入字符(^), 就可以得到“非字符类”

[a-zA-Z0-9]匹配所有的小写字母、大写字母和数字
[^aeio]匹配不在这个字符类的所有字符

2.4 插入字符和美元字符

可以在正则表达式的开始处使用插入符号(^),在正则表达式的末尾加上美元符($)

^匹配必须发生在被查找文本开始处
$字符串必须以这个正则表达式的模式结束

2.5通配符

.(句号)字符称为通配符,匹配除了换行之外所有字符,它只匹配一个字符

.*匹配任意文本,贪心模式
.*?匹配任意文本,非贪心模式

通过传入 re.DOTALL 作为 re.compile()的第二个参数, 可以让句点字符匹配所有字符, 包括换行字符

newlineRegex = re.compile('.*', re.DOTALL)
newlineRegex.search('Serve the public trust.\nProtect the innocent.
\nUphold the law.').group()

2.6 不区分大小写的匹配

re.compile()传入re.I,作为第二个参数

ro = re.compile(r'robocop',re.I)

2.7 用sub()方法替换字符串

sub()方法需要传入两个参数。第一个参数是一个字符串, 用于取代发现的匹配。第二个参数是一个字符串,即正则表达式。 sub()方法返回替换完成后的字符串。

#!/usr/bin/python3
import re
namesRegex = re.compile(r'Agent \w+')
print(namesRegex.sub('CENSORED', 'Agent Alice gave the secret documents to Agent Bob.'))

在这里插入图片描述

2.8 管理复杂的正则表达式

匹配复杂的文本模式可以告诉 re.compile(), 忽略正则表达式字符串中的空白符和注释, 从而缓解这一点。 要实现这种详细模式, 可以向 re.compile()传入变量re.VERBOSE, 作为第二个参数。
这样可以将正则表达式放在多行中, 并加上注释。

phoneRegex = re.compile(r'''(
(\d{3}|\(\d{3}\))?           # area code
(\s|-|\.)?                   # separator
\d{3}                        # first 3 digits
(\s|-|\.)                    # separator
\d{4}                        # last 4 digits
(\s*(ext|x|ext.)\s*\d{2,5})? # extension
)''', re.VERBOSE)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值