Python笔记----正则表达式

在线匹配正则表达式是否正确:https://tool.oschina.net/regex/#
正则表达式(Regular Expression)用于描述一种字符串匹配的模式(Pattern),它可用于检查一个字符串是否含有某个子串,也可用于从字符串中提取匹配的子串,或者对字符串中匹配的子串执行替换操作。

1.Python的正则表达式支持
re. compile(pattern, flags=0):该函数用于将正则表达式字符串编译成_sre.SRE_Pattern 对象, 该对象代表了正则表达式编译之后在内存中的对象,它可 缓存并复用正则表达式字符串。 如果程序需要多次使用同一个正则表达式字符串, 可考虑先编译它。
该函数的pattern参数就是它所编译的正则表达式字符串, flags 则代表了正则表达式的匹配旗标。
编译得到的__sre.SRE_Pattern对象包含了 re 模块中绝大部分函数对应的方法。

import re

'''
第一种方法预编译了正则表达式,程序可复用p对象(该对象缓存了正则表达式字符串),具有更好的性能
'''

# 先编译正则表达式
p = re.compile('abc')

# 调用_sre.SRE_Pattern对象的search()方法
p.search('www.abd.com')

print('====================')
# 或直接使用正则表达式匹配目标字符串
re.search('abc', 'www.abc.com')

​ re .match (pattern,string, flags=0):尝试从字符串的开始位置来匹配正则表达式,如果从开始位置匹配不成功, match()函数就返回 None 。其中 pattern参数代表正则表达式: string 代表被匹配的字符串; flags 则代表正则表达式的匹配旗标。该函数返回__sre.SRE_Pattern对象, 该对象包含的 span(n)方法用于获取第 n+1个组的匹配位置, group(n)方法用于获取第 n+ 1 个组所匹配的子串。#

​ re.search(pattern, string, flags=0):扫描整个字符串,并返回字符串中第一处匹配pattern的匹配对象。该函数也返回__sre.SRE_Pattern对象。
​ match()与 search()的区别在于: match()必须从字符串开始处就匹配, 只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none。search()则可以搜索整个字符串。

import re

# 从开始位置匹配
m1 = re.search('www', 'www.fkit.org')
# 返回匹配的位置
print(m1.span())
# 返回匹配的组
print(m1.group())
# 如果开始位置匹配不到,返回None
print(re.match('fkit', 'www.fkit.org'))

# 从开始位置匹配
m2 = re.search('www', 'www.fkit.org')
print(m2.span())
print(m2.group())

# 从中间位置匹配,返回match对象
m3 = re.search('fkit', 'www.fkit.org')
print(m3.span())
print(m3.group())

在这里插入图片描述

​ re.findall(pattern, string, flags=0) :扫描整个字符串,并返回字符串中所有匹配 pattern 串组成的列表。
​ re.finditer(pattern, string, flags =0):扫描整个字符串,并返回字符串中所有匹配pattern的子串组成的迭代器,迭代器的元素是__sre.SRE_Pattern对象。

import re

# 返回所有匹配pattern的子串组成的列表,忽略大小写
# re.I:使匹配对大小写不敏感
print(re.findall('www', 'www.baiwww.comwww, www', re.I))

m1 = re.finditer('www', 'www.baiwww.comwww, www', re.I)
for m in m1:
    print(str(m.span()) + '->' + m.group())

在这里插入图片描述

​ re.fullmatch(pattem, string, flags=0):该函数要求整个字符串能匹配 pattern,如果匹配则返回包含匹配信息的__sre.SRE_Pattern对象;否则返回 None。
​ re.sub(pa em, repl, string,count=0, flags=0): 该函数用于将string 宇符串中所有匹配 pattern 的内容替换成repl。repl既可是被替换字符串,也可是一个函数。 count参数控制最换多少次,如果指定 count为0,则表示全部替换。

import re

# 整个字符串匹配pattern,失败则返回None
print(re.fullmatch('www.baidu.com', 'www.baidu.com'))
print(re.fullmatch('www.baidu.co', 'www.baidu.com'))

# 替换字符串
# r'www'是原始字符串,其中r代表原始字符串
# 通过原始字符串可以避免对字符串中的特殊字符进行转义
print(re.sub(r'www', 'vvv', 'www.baidu.cowwwm, www.www.www', 0))
print(re.sub(r'www', 'vvv', 'www.baidu.cowwwm, www.www.www', 2))

在这里插入图片描述

​ re.split(pattem, string, maxsplit=0, flags=0):使用 pattern对string 进行分割,该函数返回分割得到的多个子串组成的列表。其中maxsplit参数控制最多分割几次。

import re

# 使用逗号对字符串进行分割
print(re.split(',', 'c, java, python, c++'))
# 使用逗号对字符串进行分割,指定只分割一次
print(re.split(',', 'c, java, python, c++', 1))
# 使用x进行分割,没有匹配到分割内容,啧不会执行分割
print(re.split('x', 'c, java, python, c++'))

在这里插入图片描述

​ re.purge():清除正则表达式缓存。
​ re. escape(pattern):对模式中除 ASCII 字符、数值、下画线之外的其他字符进行转义。

import re

# 对模式中的特殊字符进行转义
print(re.escape(r'www.baidu.com is good, i love it'))
print(re.escape(r'A-Zand0-9?'))

在这里插入图片描述

​ 使用 escape()函数对模式行转义之后 ,模式中除 ASCII 字符、 数值 下画线之外的其他字符都被添加了反斜线进行转义。

​ 正则表达式对象的 search()、 match()、fullmatch()、 findall(),finditer()方法的功能更强大一些,因为这些方法都可额外指定pos和endpos 两个参数,用于指定只处理目标字符串从pos 开始到 endpos 结束之间的子串。

import re

# 使用compile()函数编译得到正则表达式对象
pa = re.compile('python')
# 调用match方法,从开始位置匹配
# 此处指定从索引7的地方开始匹配
print(pa.match('i love python', 7).span())
# 此处指定从索引7到索引10之间开始匹配
print(pa.match('i love python', 7, 10))
# 此处指定从索引7的地方开始匹配
print(pa.match('i love python', 7, 13).span())

在这里插入图片描述

​ 程序使用 compile()函数编译正则表达式之后,该函数所返回的对象就会缓存该正则表达式,从而可以多次利用该正则表达式执行匹配。比如上面程序多次使 pa 对象(它缓存了正则表达式〉来执行匹配。

​ 组是正则表达式中很常见的-个东西:用圆括号将多个表达式括起来形成组。如果正则表达式中没有圆括号,那么整个表达式就属于一个默认组。

import re

# 在正则表达式中使用组
m = re.search(r'(baidu).(com)', r'www.baidu.com is a good com')
print(m.group(0))

# 调用简化写法
print(m[0])
print(m.span(0))
print(m.group(1))

print(m[1])
print(m.span(1))
print(m.group(2))

print(m[2])
print(m.span(2))
print(m.group())

在这里插入图片描述

​ 上面程序中 search()函数使用了 个正则表达式:r’(baidu) (com)’,在该正则表达式内包含两个组,即(baidu)和(com),因此程序可以依次获取 group(0), group(l), group(2)的值。

​ 如果在正则表达式中为组指定了名字(用?P<名字>为正则表达式的组指定名字),就可以调用 groupdict()方法来获取所有组所匹配的字符串组成的宇典,其中组名作为字典的 key。例如:

import re

m = re.search(r'(?P<prefix>baidu).(?P<suffix>com)', r'www.baidu.com')
print(m.groupdict())

在这里插入图片描述

​ 此处返回的字典的 key 为正则表达式中的组名, value 为该组所匹配的子串。

2.正则表达式旗标
re.A或re.ASCII: 该旗标控制\w, \W, \b,\B ,\d,\D, \s和\S只匹配 ASCII 字符,而不匹配所有的 Unicode 字符。也可以在正则表达式中使用(?a)行内旗标来代表。
re.DEBUG :显示编译正则表达式的 Debug 信息 。没有行内旗标 。
re.I或re.IGNORECASE :使用正则表达式匹配时不区分大小写,对应于正则表达式中的(?i)行内旗标。
re.L或re.LOCALE :根据当前区域设置使用正则表达式匹配时不区分大小写。该旗标只能bytes 模式起作用,对应于正则表达式中的(?L)行内旗标。
re.M或re.MULTILINE :多行模式的旗标。当指定该旗标后, “^”能匹配字符串的开头和每行的开头(紧跟在每一个换行符的后面);“ ” 能 匹 配 字 符 串 的 末 尾 和 每 行 的 末 尾 ( 在 每 一 个 换 行 符 之 前 ) 。 在 默 认 情 况 下 , “ ” 只 匹 配 字 符 串 的 开 头 , “ ”能匹配字符串的末尾和每行的末尾(在每一个换行符之前)。在默认情况下, “^”只匹配字符串的开头, “ ()”只匹配字符串的结尾,或匹配到字符串默认的换行符(如果有)之前 。对应于正则表达式中的(?m)行内旗标。
re.S或s.DOTALL 让点(.)能匹配包括换行符在内的所有字符,如果不指定该旗标,则点(.)能匹配不包括换行符的所有字符。对应于正则表达式中的(?s)行内旗标。
re.U或re.Unicode :该旗标控制\w, \W, \b,\B ,\d,\D, \s和\S能匹配所有的 Unicode 字符。这个旗标在 Python 3.x 中完全是多余的,因为 Python 3.x 默认就是匹配所有的Unicode 字符。
re.X或re.VERBOSE:通过该旗标允许分行书写正则表达式,也允许为正则表达式添加注释,从而提高正则表达式的可读性 对应于正则表达式中的(?x)行内旗标。

3.创建正则表达式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

​ 方括号表达式比前面的预定义字符灵活得多,几乎可以匹配任意字符。例如,若需要匹配所有的中文字符,就可以利用[\\u004 -\\u0056 ]的形式。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值