- 正则表达式对象
- 正则表达式修饰符
- 正则表达式模式
- re.match
- re.search
- 检索和替换
- re.compile
- findall
- re.finditer
- re.split
正则表达式对象
方法名称 | 作用 |
---|---|
group | 以str形式返回对象中match的元素 |
start | 返回开始的位置 |
end | 返回结束的位置 |
span | 以tup形式返回范围 |
注意:这些方法不适用于findall,findall返回的是一个list
正则表达式修饰符
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。
修饰符 | 描述 |
---|---|
re.l | 使匹配对大小写不敏感 |
re.L | 做本地化识别(local-aware)匹配 |
re.M | 多行匹配影响^和$ |
re.S | 使.匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响\w,\W,\b,\B |
re.X | 该标志通过给予你更灵活的格式以便你将则正则表达式写的更易于理解 |
正则表达式模式
模式 | 描述 |
---|---|
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾 |
. | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。 |
[…] | 用来表示一组字符,单独列出:[amk]匹配’a’,“m”,或"k" |
[^…] | 不在[]中的字符:[^abc]匹配除了a,b,c之外的字符 |
re* | 匹配0个或多个的表达式 |
re+ | 匹配一个或多个的表达式 |
re? | 匹配0个或一个由前面的正则表达式定义的片段,非贪婪模式 |
re{n} | 精确匹配n个前面的表达式。 |
re{n,} | 匹配n到m次由前面的正则表达式定义的片段,贪婪方式 |
(?#…) | 注释 |
\w | 匹配字母数字及下划线 |
\W | 匹配非字母数字及下划线 |
\s | 匹配任意空白字符 |
\S | 匹配人资非空字符 |
\d | 匹配任意数字 |
\D | 匹配任意非数字 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,结果是存在换行,只匹配到换行前的结束字符串。 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。 |
\B | 匹配非单词边界。 |
\n,\t等 | 匹配一个换行符。匹配一个制表符 |
re.match
re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置的话,match()就返回None。
语法:
re.match(pattern, string, flags=0)
参数:
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方法 |
匹配成功re.match方法返回一个匹配的对象,否则返回None
re.search
re.search 扫描整个字符串并返回第一个成功的匹配
语法:
re.search(parttern, string, flags=0)
参数:
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方法 |
匹配成功re.search方法返回一个匹配的对象,否则返回None
例:
import re
#在起始位置匹配
print(re.search('www', 'www.baidu.com').span())
#不在起始位置匹配
print(re.search('com', 'www.baidu.com').span())
(0, 3)
(10, 13)
re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None,而re.search匹配整个字符串,直到找到一个匹配。
检索和替换
python的re模块提供了re.sub用于替换字符串中的匹配项
语法:
re.sub(pattern, repl, string, count=0, flags=0)
参数:
- pattern : 正则中的模式字符串。
- repl : 替换的字符串,也可为一个函数。
- string : 要被查找替换的原始字符串。
- count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
例:
import re
phone = "2004-959-559 # 这是一个国外电话号码"
#删除字符串中的python注释
num = re.sub(r'#.*$', "", phone)
print("电话号码是:", num)
#删除非数字(-)的字符串
num = re.sub(r'\D', "", phone)
print("电话话是:", num)
电话号码是:2004-959-559
电话号码是:2004959559
re.compile
compile函数用于编译正则表达式,生成一个正则表达式(Pattern)对象,供match()和search()两个函数使用。
语法:
re.compile(pattern[, flags])
参数:
- pattern : 一个字符串形式的正则表达式
- flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
- re.I忽略大小写
- re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
- re.M 多行模式
- re.S即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
- re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
- re.X 为了增加可读性,忽略空格和 # 后面的注释
例:
import re
pattern = re.compile(r'\d+') #匹配至少一个数字
#查找头部,没有匹配
m = pattern.match('one12twothree34four')
print(m)
结果:None
#从‘e’的位置开始匹配,没有匹配
m = pattern.match('one12twothree34four', 2, 10)
结果:None
#从‘1’的位置开始匹配,正好匹配
m = pattern.match('one12twothree34four', 3, 10)
print(m)
#返回一个Match对象
结果:<_sre.SRE_Match object at 0x10a42aac0>
findall
在字符串中找到正则表达式所匹配的所有子串,返回一个列表,如果没有找到匹配的,则返回空列表
注意:match和search是匹配一次findall匹配所有
语法:
findall(string, pos[, endpos])
参数:
- string : 待匹配的字符串。
- pos : 可选参数,指定字符串的起始位置,默认为 0。
- endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。
例:
import re
pattern = re.compile(r'\d+') #查找数字
result1 = pattern.findall('runoob 123 google 453')
result2 = pattern.findall('run88oob123google456', 0, 10)
print(result1)
print(result2)
结果:
['123', '456']
['88', '12']
re.finditer
和findall类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
re.finditer(pattern, string, flags=0)
参数:
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式 |
例:
import re
it = re.finditer(r"\d+","12a32bc43jf3")
for match in it:
print(match.group())
#结果:
12
32
43
3
re.split
split方法按照能够匹配的子串将字符串分割后返回列表
语法:
re.split(pattern, string[, maxspilt=0, flags=0])
参数:
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
maxspilt | 分隔次数,maxspilt=1分隔一次,默认0 |
flags | 标志位,用于控制正则表达式的匹配方式 |
例:
import re
re.split('\W+', 'runoob, runoob, runoob.')
['runoob', 'runoob', 'runoob', '']
人生漫漫其修远兮,网安无止境。
一同前行,加油!