正则表达式Re库介绍
原创
©著作权归作者所有:来自51CTO博客作者WongKyunban的原创作品,请联系作者获取转载授权,否则将追究法律责任
Re库是python的标准库,Re库采用raw string(原生字符串类型)表示正则表达式,如 r’[1-9]\d{5}’。
调用方法 :
使用原生字符串(即不包含转义符的字符串)类型表示正则表达式会更方便。python有一个转义斜杠’’,在原生字符串中斜杠’'不会被解释成转义符。正则表达式也可以用String类型来表示,但是很繁琐。
电话号码的两种正则表达式写法比较:
raw string原生字符串:r’\d{3}-\d{8}|\d{4}-\d{8}’
String字符串类型:’\\d{3}-\\d{8}|\\d{4}-\\d{8}’
字符串类型中对斜杠‘'进行了转义,为了避免斜杠被转义,我们需要用一个斜杠来转义它,这样子后,原来是杠的,变成杠杠。相比之下,原生字符串就显得方便多了。
Re库主要功能函数
函数
| 说明
|
re.search()
| 返回match对象,在一个字符串搜索匹配正则表达式的第一个位置
|
re.match()
| 返回match对象,从一个字符串的开始位置起匹配正则表达式
|
re.findall()
| 搜索字符串,以列表类型返回全部能匹配的子串
|
re.split()
| 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
|
re.finditer()
| 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
|
re.sub()
| 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串
|
示例代码:
import re
if __name__ == "__main__":
# search(pattern, string, flags=0)
# pattern正则表达式,可以是原生字符串类型(前面放个小r),也可以是字符串类型的正则表达式
# string 待匹配的内容
# flag是控制标记,有三种:
# re.I 或 re.IGNORECASE,忽略正则表达式的大小写,[A-Z]也能够匹配小写字符
# re.M 或 re.MULTILINE ,作用在正则表达式中的^操作符,能够将给定的字符串的每行当作匹配的开始
# re.S 或 re.DOTALL,作用在正则表达式中的.操作符,能够匹配所有字符,默认匹配除换行外的所有字符。
match = re.search(r'[1-9]\d{5}', 'China 102256', re.I)
# 一定要加if判断
if match:
print(match.group(0))
# 从一个字符串的开始位置起匹配正则表达式
m_match = re.match(r'[1-9]\d{5}', '100002BiT')
if m_match:
print(m_match.group(0))
# 返回列表
list = re.findall(r'[1-9]\d{5}', 'BIT100005 188898TTu')
print(list)
# split(pattern, string, maxsplit=0, flags=0)
# pattern正则表达式,可以是原生字符串类型(前面放个小r),也可以是字符串类型的正则表达式
# string 待匹配的内容
# maxsplit最大分割数,剩余部分将作为最后一个元素输出
# flag是控制标记,有三种:
# re.I 或 re.IGNORECASE,忽略正则表达式的大小写,[A-Z]也能够匹配小写字符
# re.M 或 re.MULTILINE ,作用在正则表达式中的^操作符,能够将给定的字符串的每行当作匹配的开始
# re.S 或 re.DOTALL,作用在正则表达式中的.操作符,能够匹配所有字符,默认匹配除换行外的所有字符。
split = re.split(r'[1-9]\d{5}', 'BIT100005 188898TTu', maxsplit=1)
print(split)
# 返回一个匹配结果的迭代类型
for m in re.finditer(r'[1-9]\d{5}', 'BIT100005 188898TTu'):
if m:
print(m.group(0))
# sub(pattern, repl, string, count=0, flags=0):
# pattern正则表达式,可以是原生字符串类型(前面放个小r),也可以是字符串类型的正则表达式
# repl 替换匹配字符串的字符串
# string 待匹配的字符串
# count匹配替换的最大次数
# flags控制标记,作用同上
sub = re.sub(r'[1-9]\d{5}', 'HelloWorld', 'BIT100005 188898TTu')
print(sub)
# 以下都是函数式的用法适合一次性操作,还有另外一种面向对象用法,编译后可以多次操作
# compile可以将正则表达式编译成一个对象
pat = re.compile(r'[1-9]\d{5}')
rst = pat.search("BIT 899990")
print(rst.group(0))
Match对象的属性
属性
| 说明
|
.string
| 待匹配文本
|
.re
| 匹配时使用的pattern对象(正则表达式)
|
.pos
| 正则表达式搜索文本的开始位置
|
.endpos
| 正则表达式搜索文本的结束位置
|
Match对象的四个常用方法
方法
| 说明
|
.group(0)
| 获得匹配后的字符串
|
.start()
| 匹配字符串在原始字符串中的开始位置
|
.edn()
| 匹配字符串在原始字符串中的结束位置
|
.span()
| 返回(.start(),.end())
|
示例代码:
import re
if __name__ == "__main__":
match = re.search(r'[1-9]\d{5}', 'BIT100005 188898TTu')
print(match.string)
print(match.re)
print(match.pos)
print(match.endpos)
print(match.group(0))
print(match.start())
print(match.end())
print(match.span())
Re默认采用贪婪匹配,就是返回最长匹配。如果要获得最短匹配,要使用以下最小匹配操作符:
操作符
| 说明
|
*?
| 前一个字符0次或无限次扩展,最小匹配
|
+?
| 前一个字符1次或无限次扩展,最小匹配
|
??
| 前一个字符0次或1次扩展,最小匹配
|
{m,n}?
| 扩展前一个字符m至n次(含n),最小匹配
|
当有操作符可以匹配不同长度的时候,可以在这个操作符后面加?,获得最小匹配。
谢谢阅读