python正则表达式
一、什么是正则表达式?
正则表达式是一个特殊的字符序列,用来判断一个字符串与我们所设定的字符序列是否相匹配。实现快速检索文本和一些替换文本的操作。
re库常见函数
1、re.match
定义
re.match 尝试从
字符串的起始位置
匹配一个模式,如果不是起始位置匹配成功的话,match 会返回none。
函数语法
re.match(匹配的正则表达式,要匹配的字符串,标志位)
可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式
group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
例子
import re
re.match(r'l','liulan').group() #返回l
re.match(r'l','liulan1') #返回none
2、re.search
定义
re.search 扫描
整个字符串
并返回第一个成功
的匹配
语法
re.search(匹配的正则的表达式,匹配的字符串,标志位)
例子
import re
re.search(r'y','liuyan1').group() #返回y
3、re.findall 和re.finditer
findall定义
在字符串中找到正则表达式
所匹配到的所有字符串
,并返回一个列表
如果找到多个匹配模式,则返回元组列表
如果没有找到匹配的,则会返回空列表
finditer定义
re.finditer和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们
作为一个迭代器返回
。
两语法一样
re.findall(待匹配的字符串,指定字符串的起始位置 [默认为0],字符串的结束位置 [默认为字符串的长度] )
例子
import re
a='C55C++66Java77C#88Python99Javascript'
print(re.findall('\d',a)) #\d 是匹配数字
#运行结果:['5', '5', '6', '6', '7', '7', '8', '8', '9', '9']
it = re.finditer(r"\d+","12a32bc43jf3")
for match in it:
print (match.group() )
12
32
43
3
4、re.sub
定义
用于替换字符串中的匹配项
语法
re.sub(正则表达式,替换的字符,原始数据,替换的次数
[默认0 是替换所有的匹配]
)
替换的字符也可以是一个函数
例子
import re
p = '2004-959-559 # 这是一个电话号码'
# 删除注释 也就是#后面的东西
re.sub(r"#.?*$","",p)
#移除 非数字的内容
re.sub(r'\D','',p)
#运行结果:
#电话号码 : 2004-959-559
#电话号码 : 2004959559
# 是一个函数时
# 将匹配的数字乘以 2
def double(matched):
value = int(matched.group('value'))
return str(value * 2)
s = 'A23G4HFD567'
print(re.sub('(?P<value>\d+)', double, s))
5、compile 函数
定义
conpile 函数用于
编译正则表达式
,生成一个正则表达式(Pattern)对象
,供match()和search()这
两个函数使用
语法
re.compile(一个字符串形成的正则表达式,匹配模式
[可选]
)
例子
import re
pattern = re.compile(r'\d+') # 用于匹配至少一个数字
m = pattern.match('one12twothree34four') # 查找头部,没有匹配
print(m)
#运行结果 None
m = pattern.match('one12twothree34four',2,10)# 从'e'的位置开始匹配,没有匹配
print(m)
#运行结果 None
m = pattern.match('one12twothree34four', 3, 10) # 从'1'的位置开始匹配,正好匹配
print(m) # 返回一个 Match 对象
#运行结果:<_sre.SRE_Match object at 0x10a42aac0>
6、re.split
定义
按照能够匹配的子串将字符串分割后返回列表
语法
re.split(正则,源数据,分隔次数,标志位)
分割次数: 默认为0 不限制 其他 1就是1次 2就是2次
例子
import re
re.split('\W+', 'runoob, runoob, runoob.')
#运行结果['runoob', 'runoob', 'runoob', '']
re.split('(\W+)', ' runoob, runoob, runoob.')
#运行结果['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', '']
re.split('\W+', ' runoob, runoob, runoob.', 1)
#运行结果['', 'runoob, runoob, runoob.']
re.split('a*', 'hello world') # 对于一个找不到匹配的字符串而言,split 不会对其作出分割
#运行结果['hello world']
二、正则表达式修饰符-可选标志
定义
正则表达式可以包含一些可选标志修饰符来控制匹配的模式,修饰符被指定为一个可选的标志。
多个标志可以通过按位OR(|)它们来指定。
如:re.l | re.M 被设置成I 和M的标志
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据 Unicode字符集解析字符,这个标志影响\w \W \b \B |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写的更易于理解 |
三、正则表达式模式(特殊写法)
模式字符串使用特殊的语法来表示一个正则表达式:
1.字母
和数字
表示他们自身
,一个正则表达式模式中的字母和数据匹配i相同 的字符串
2. 多数字母和数字前 加一个 反斜杠
会拥有不同的含义
3. 标点符号只有被转义时才匹配自身,否则他们表示特殊的含义
4. 反斜杠本身需要使用反斜杠转义
5. 由于正则表达式通常都包含反斜杠,所以我们最好使用原始字符串来表示他们,模式元素(如如 r’\t’,等价于 ‘\t’ )匹配相应的特殊字符
四、特殊元素
模式 | 描述 |
---|---|
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 |
. | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符 |
[…] | 用来表示一组字符,单独列出,如:[amk]匹配’a’,‘m’或’k’ |
[^…] | 不在[ ]中的字符,如[^abc]匹配除了a,b,c之外的字符 |
re* | 匹配0个 或者多个的表达式 |
re+ | 匹配一个 或多个表达式 |
re{n} | 精确匹配 n个前面表达式。例如:o{2}不能匹配“Bob”中的“o“(因为他可以理解为o{1},但是能匹配”food“中的两个0) |
re{n,} | 匹配前面n个表达式。例如:o{2,}不能匹配"Bob"中的"o",但是能匹配”Fooooood“中所有的o(我理解为最低为n个表达式 可以匹配比n多的表达式) ,‘o{1,}’ 相当于 re+ ; o{0,} 相当于 re* |
re{n,m} | 匹配n到m次由前面的正则表达式定义的片段,贪婪方式 |
a | b |
(re) | 对正则表达式分组并记住匹配的文本 |
(?imx) | 正则表达式包含三种可选标志:i,m,x。只影响括号中的区域 |
(?-imx) | 正则表达式关闭i,m,x可选标志。只影响括号中的区域 |
(?:re) | 类似(…)但是不是表示一个组 |
(?-imx:re) | 在括号里不使用i,m,x可选标志 |
(?#…) | 注释. |
(?=re) | 前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。 |
(?!re) | 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功 |
(?>re) | 匹配的独立模式,省去回溯 |
\w (小) | 匹配数字、字母、下划线 |
\W(大) | 匹配非 字母、数字、下划线 |
\s(小) | 匹配任意空白字符,等价于[ \t\n\r\f] \t制表符 \r 回车符 \n 换行符 \f 换页符 |
\S (大) | 匹配任意非空白字符 等价于[ ^\t\n\r\f] |
\d | 匹配任意数字,等价于[0-9] |
\D | 匹配任意非数字 ,等价于[^0-9] |
\A | 匹配字符串开始 |
\Z(大) | 匹配字符串结束,如果是存在换行,只匹配到换行前 的结束字符串 |
\z (小) | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如,‘er\b’可以匹配’never’中的’er’,但是不能匹配’verb’中的’er’ ,就是理解为 边界字符为匹配字符 |
\B | 匹配非单词边界,‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’,就是理解为 匹配的字符不在边界才能匹配到 |
\n,\t,等 | 匹配一个换行符,一个制表符等 |
\1…\9 | 匹配第n个分组的内容 |
\10 | 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。 |
五、正则表达式实例
字符匹配
字符类
实例 | 描述 |
---|---|
[Pp]ython | 匹配”Python“或者‘python’ |
rub[ye] | 匹配‘ruby’或者‘rube’ |
[aeiou] | 匹配括号中的任意一个字符 |
[0-9] | 匹配任何数字。类似于[0123456789] |
[a-z] | 匹配任何小写字母 |
[A-Z] | 匹配任何大写字母 |
[a-zA-Z0-9] | 匹配任何字母及数字 |
[^aeiou] | 匹配除了aeiou字母以外的所有字符 |
[^0-9] | 匹配除了数字外的字符 |
特殊字符类
实例 | 描述 |
---|---|
. | 匹配除了’\n’之外的任何单个字符,要匹配包括’\n’在内的任何字符,请使用像‘[.\n]’的模式 |
\d | 匹配一个数字字符,等价于[0-9] |
\D | 匹配一个非数字字符,等价于[^0-9] |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等,等价于[\f\n\r\t\v] |
\S | 匹配任何非空字符,等价于[^\f\n\r\t\v] |
\w | 匹配包括下划线的任何单词字符,等价于 [A-Za-zo-9_] |
\W | 匹配任何非单词字符,等价于[^A-Za-zo-9_] |