山水沐光 2020-06-25
re模块是python独有的匹配字符串的模块,该模块中提供的很多功能是基于正则表达式实现的,而正则表达式是对字符串进行模糊匹配,提取自己需要的字符串部分,他对所有的语言都通用。
注意点:正则表达式会对特殊字符进行转义,如果要保持原模样,只需加个r前缀。例如:r‘\thello-\rworld‘
禁止转义!反斜杠不会被任何特殊方式处理。
Python编译器用‘\’(反斜杠)来表示字符串常量中的转义字符。
如果反斜杠后面跟着一串编译器能够识别的特殊字符,那么整个转义序列将被替换成对应的特殊字符(例如,‘\n’将被编译器替换成换行符)
本质上来讲,使用r,你在告诉编译器完全不要去干涉你的字符串
常见转义符
元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
字符 | 说明 |
---|---|
. | 匹配除换行符以外的所有字符 |
[...] | 匹配字符集 |
\w | 匹配字母、数字及下划线_ ,等价于[A-Za-z0-9_] |
\W | 匹配所有与\w不匹配的字符(取反) |
\s | 匹配单个空格符、包括tab键和换行符 |
\S | 匹配除单个空格之外的字符 |
\d | 匹配从0到9的数字,等价于[0-9] |
\D | 匹配非数字 |
^ | 匹配输入字符串开始的位置 |
$ | 匹配输入字符串结尾的位置 |
限定符用来限定一个目标子表达式要重复出现多少次才匹配成功
限定符 | 说明 |
---|---|
* | 匹配前面的字符0次或多次 |
+ | 匹配前面的字符1次或多次 |
? | 匹配前面的字符0次或1次 |
{n} | 匹配前面的字符n次 |
{n,} | 匹配前面的字符至少n次 |
{n,m} | 匹配前面的字符至少n次,最多m次 |
www.baidu.com
www\.baodu\.com
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。
非贪婪匹配:就是匹配到结果就好,最少的匹配字符。
默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。
字符 | 说明 |
---|---|
* | 允许前一个字符可以出现0次或者无数次 |
+ | 前一个字符至少出现1次 |
? | 前一个字符只能出现一次或者不出现 |
{n} | 允许前一个字符只能出现n次 |
{n,m} | 允许前一个字符出现n到m次 |
{n, } | 允许前一个字符至少出现n次 |
转义字符 | 描述 |
---|---|
\(在行尾时) | 续行符 |
\\ | 反斜杠符号 |
\‘ | 单引号 |
\" | 双引号 |
\a | 响铃 |
\b | 退格(Backspace) |
\e | 转义 |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
\oyy | 八进制数,例如:\o12 代表换行 |
\xyy | 十进制数,例如:\x0a 代表换行 |
\other | 其他的字符以普通格式输出 |
标志 | 说明 |
---|---|
re.S | 匹配包括换行在内的所有字符 |
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配,法语等 |
re.M | 多行匹配,影响^和$ |
re.X | 该标志通过给予更灵活的格式以便将正则表达式写得更易于理解 |
re.U | 根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B |
re.I 使匹配对大小写不敏感,如下:
# re.I 的学习,忽略大小写 S1 = ‘CoN‘ #定义字符串i1 S2 = ‘www.xiao.con‘ #定义字符串i2 #print(re.search(‘CoN‘,‘www.xiao.con‘).group()) #区分大小写的子组输出,报有错 print(re.search(S1,S2,re.I).group()) #不区分大小写的子组输出 # con
re.M 使用^ 和 $ 符号,实现多行多行匹配。如将所有行的末尾字符串输出得:
# re.M 的学习,将所有行的尾字母或者首部输出 S3 = ‘‘‘I am girl you are boy we are friends ‘‘‘ #定义初始字符串 print(re.findall(r"\w+$",S3,re.M)) #输出S3的每行最后一个字符串 # [‘girl‘, ‘boy‘, ‘friends‘]
re.S匹配包括换行在内的所有字符。如下:
s1 = ‘‘‘jduedhhelloworld: 11630 passgrthgdg ‘‘‘ #初始字符串,有换行所以用三引号 b = re.findall(‘hello(.*?)pass‘,s1) #findal返回字符串中某个正则表达式模式全部的非重复出现的情况,不包含换行,返回列表 c = re.findall(‘hello(.*?)pass‘,s1,re.S) #包含换行 print(‘b is‘,b) #输出B匹配的结果 b is [] print(‘c is‘,c) #输出C,包行匹配输出的结果 c is [‘world: \n 11630\n ‘]
re.findall()
函数语法:re.findall(pattern, string, flags=0)
——> list(列表)
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式
列出字符串中模式的所有匹配项,并作为一个列表返回。如果无匹配,则返回空列表!
import re print(re.findall(r"ab","abcaaaab")) [‘ab‘, ‘ab‘] #匹配的值作为一个列表范围
re.compile()
函数语法:re.compile(pattern, flags=0)
——> pattern object
根据包含正则表达式的字符串创建模式对象,可以实现更有效率地匹配!用了re.compile以后,正则对象会得到保留,这样在需要多次运用这个正则对象的时候,效率会有较大的提升
import re s=r"^010-\d{8}$" print(re.findall(s,"010-12345678")) # [‘010-12345678‘] p_tel=re.compile(s) #对s这个正则表达式创建模式对象p_tel print(p_tel) # <_sre.SRE_Pattern object at 0x7f3ab3776d78> print(p_tel.findall("010-12345678")) #经过compile转换的正则表达式对象也能用于普通的re函数,跟上面的re.findall(s,"010-12345678")一样的效果 # [‘010-12345678‘]
re.match()
函数语法:re.match(pattern, string, flags=0)
——> match object or None
在字符串的开始位置匹配正则!如果无匹配,则返回 None 。
import re s=r"abc" com=re.compile(s) com.match("abcdef") #abc在开始的位置,可以匹配 # <_sre.SRE_Match object at 0x7f3ab3480cc8> print(com.match("hhhabc")) #abc不在开始的位置,不可以匹配 # None # 使用group()-返回匹配的数据 com.match("abcddddd").group() #使用group()返回匹配的对象 # ‘abc‘
re.search()
函数语法:re.search(pattern, string, flags=0)
——> match object or None
re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None
re.match与re.search的区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
re.sub()
函数语法:re.sub(pattern, repl, string, count=0, flags=0)
——> string
将字符串中所有 pattern 的匹配项用 repl 替换!
import re re.sub(r"abc","123","abcdefabc") # ‘123def123‘
re.split()
函数语法:re.split(pattern, string, maxsplit=0, flags=0)
——> list
根据模式的匹配项来分割字符串
import re re.split(r"\d+","aa11bb22cc") #以正则表达式\d+为分割符 [‘aa‘, ‘bb‘, ‘cc‘] re.split(r"\d","aa11bb22cc") #以正则表达式\d+为分割符 [‘aa‘, ‘‘, ‘bb‘, ‘‘, ‘cc‘]