正则表达式
正则表达式处理字符串 对字符串进行检索和替换
用户输入是否符合要求
查找方法
import re
-
match
匹配开头 只匹配字符串的开头
re.match(规则,字符串)
返回一个对象<re.Match object; span=(0, 2), match=‘he’>
开头不匹配返回None
-
search
匹配整个字符串 返回一个对象
# match 和 search 区别
# 共同点:只对字符串查询一次 返回类型都是re.match object对象
# 不同点:match 从头开始查询 匹配不到就返回None search 匹配整个字符串
-
findall
- 把查到的所有字符串都放在列表里面
- re.findall(‘规则’,字符串)
-
finditer
- 把所有的匹配内容放在可迭代对象里面
- 返回可迭代对象
- for in 和 list可取出
-
fullmatch
- 需要规则和字符串完全一样 完全匹配
-
# # match匹配开头 search匹配整个字符串 ## findall 查到的字符串放在列表中 finditer 匹配内容放在字符串里 ## fullmatch需要规则和字符串完全一致
re.Match类
import re
text = 'fdsfsidnpqw 12213dasc'
m = re.search(r's',text)
print(m.pos,m.endpos)
# m = re.search(r's',text)
# print(m.pos,m.endpos)
# # 搜索开始的位置 搜索结束的位置
#
print(m.string) #fdsfsidnpqw12213dasc搜索的字符串
print(m.re) # 当前搜索的规则
-
.pos .endpos
- 搜索开始的位置 搜索结束的位置
- 返回字符串索引的开始下标和结束下标
-
.string
- .string返回搜索的字符串
-
.re
- 当前搜索的规则
-
.group()
-
获取匹配的字符串
-
text = 'fd2sfsid3np33qw412213dasc' m1 = re.search(r'(2.*)(3.*)(4.*)(3.*)',text) print(m1.group(0)) # 2sfsid3np33qw412213dasc print(m1.group(1)) #2sfsid3np3 print(m1.group(2)) #3qw print(m1.group(3)) #41221 print(m1.group(4)) #3dasc
-
-
.start() .end()获取组的开始坐标和结束坐标
- start(第几组) 使用group()可查看分组
-
.groupdict()
- 返回分组形式的字典类型
m2 = re.search(r'(?P<test>2.*)(?P<haha>3.*)(?P<xixi>4.*)',text) # m2 = re.search(r'(?P<test>2.*)(?P<haha>3.*)(?P<xixi>4.*)',text) print(m2.groupdict()) ## {'test': '2sfsid3np3', 'haha': '3qw', 'xixi': '412213dasc'} print(m2.start(1))
compile 先确定规则 在使用方法
-
text = 'asdasaefswwdwdpoenvblfgppuyx' res = re.compile(r'w.*d') print(res) #re.compile('w.*d') # result = res.search(text) print(result) #<re.Match object; span=(9, 14), match='wwdwd'>
替换 sub
# text = 'e34te3w54358765esdferte'
# print(re.sub(r'\d','*',text)) # e**te*w********esdferte
\d 匹配数字 单个数字
# print(re.sub(r'\d+','*',text)) # e*te*w*esdferte
\d+ 匹配多个数字
# 第一个参数 正则表达式
# 第二个参数 替换后的字符
# 第三个 字符串
text = '45retyuytredde345r342rer455treq324ew'
def haha(x):
y = int(x.group(0))
y*=2
return str(y)
# print(re.search(r'\d+',text).group(0))
print(re.sub(r'\d+',haha,text))
修饰符
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.M | 多行匹配,影响^和$ |
re.S | 使匹配包括换行在内的所有字符 |
特殊字符
特殊字符 | 描述 |
---|---|
() | 标记一个子表达式的开始和结束位置,子表达式可以获取供以后使用 |
. | 匹配除换行符\n之外的任何单字符。要匹配.,请使用 \ .。 |
[ | 标记一个中括号表达式的开始 |
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符, \\ 匹配 \ ,而 \( 则匹配 ( 。 |
{ | 标记限定符表达式的开始。要匹配 {,请使用 \{ |
| | 指明两项之间的一个选择。要匹配 |
\d | 匹配一个数字字符。等价于 [0-9]。 |
[0-9] | 匹配任何数字。等价于 \d |
\D | 匹配一个非数字字符。等价于 [^0-9] 。 |
特殊字符 | 描述 |
---|---|
[a-z] | 匹配任何小写字母 |
[A-Z] | 匹配任何大写字母 |
[a-zA-Z0-9] | 匹配任何字母及数字。等价于\w |
\w | 匹配包括下划线的任何单词字符。等价于[A-Za-z0-9_] 。 |
\W | 匹配任何非单词字符。等价于 [^A-Za-z0-9_] 。 |
[\u4e00-\u9fa5] | 匹配纯中文 |
定位符
字符 | 描述 |
---|---|
* | 匹配前面的子表达式零次或多次。例如,zo 能匹配 “z” 以及 “zoo”。 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 、 “does” 中的 “does” 、 “doxy” 中的 “do” 。? 等价于 {0,1}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。 |
字符 | 描述 |
---|---|
\cx | 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。 |
\f | 匹配一个换页符。等价于 \x0c 和 \cL。 |
\n | 匹配一个换行符。等价于 \x0a 和 \cJ。 |
\r | 匹配一个回车符。等价于 \x0d 和 \cM。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v] 。 |
\t | 匹配一个制表符。等价于 \x09 和 \cI。 |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK。 |