一、正则表达式
1.什么是正则表达式(语法通用)
正则就是一种用来做字符串匹配的工具,可以通过不同的符号匹配不同的字符
2.python对正则表达式的支持
通过re模块提供相应支持正则表达式的方法
- a.fullmatch(正则表达式,字符串)--> 用正则表达式来和指定字符串进行匹配。
如果匹配成功返回匹配对象,匹配失败返回None
python中的正则表达式是写在字符串中的,但是一般情况下会在最前面加r/R
from re import fullmatch, search
1 普通字符(代表字符本身)
匹配一个字符串,只有三个字符,每个字符分别是a,b,c
re_str = r'abc'
result = fullmatch(re_str, 'abc')
print(result)
2 . (除\n之外,匹配任意字符)
匹配一个字符串,只有三个字符,第一个字符是a,第二个字符是任意字符,最后一个字符是c
re_str = r'a...c' # 可以加多个点每一个点是一个字符
result = fullmatch(re_str, 'a-*&c')
print(result)
3 \w (匹配字母数字下划线中文,一个\w只能匹配一个字符)
匹配一个字符串,第一个字符是任意字符,第二个和第三个字符是字母、数字或者_
re_str = r'.a\w\w'
result = fullmatch(re_str, 'aa_3')
print(result)
4 \s (匹配空白字符,指的是所有能产生空白的字符,包括空格、制表符、换行等)
第一个字符是任意字符,第二个是字母数字下划线中文,第三个是空白,第四个是任意字符,第五个是空白
####### 注意:\r和\n都可以表示空白
re_str = r'.\w\s.\s'
result = fullmatch(re_str, 'a2 &\n')
print(result)
5 \d (匹配数字字符)
re_str = r'.\w\d'
result = fullmatch(re_str, '2_3')
print(result)
6 \b (检测单词边界,即检测正则表达式中\b所在的位置是否是单词边界)
单词边界:所有可以将两个单词区分开的符号都是单词边界,如: 空格、缩进、标点符号
匹配一个字符串的内容是'how are',并且要求字符'a'的前面是单词边界
注意:\b不是匹配符号,不会匹配出一个字符,只是检测所在的位置是否满足要求
re_str = r'how \bare'
result = fullmatch(re_str, 'how are')
print(result)
7 ^ (检测字符串开头)
匹配一个字符串,并且第一个字符所在的位置是字符串开头
re_str = r'^.\w\s\d'
result = search(re_str, 'a2 2*&342gwg')
print(result)
8 $ (检测字符串结尾)
匹配一个字符串是三个数字字符,并且最后一个字符的后面是字符串结尾
re_str = r'\d\d\d$'
result = search(re_str, 'fhowqh2141')
print(result)
9 [字符集] (匹配字符集中的任意一个字符)
注意:一个[]代表一个字符
-
a.普通用法: [字符集] -- 匹配字符集中的任意一个字符
-
b.表示范围: [字符1-字符2] -- 匹配字符1到字符2中所有的字符,要求字符1的编码值要小于字符2的编码值
[1-9] - 数字1到9
[a-z] - 小写字母
[A-Z] - 大写字母
[a-zA-Z] - 所有字母
[a-zA-Z\d_] - 数字字母下划线匹配一个字符串有四个字符,第一个字符是'a'或者'b'或者'c',后边是123
re_str = r'[abc]123'
result = fullmatch(re_str, 'a123')
print(result)
###### 匹配一个字符串有4个字符,第一个字符是数字1-9中的任意一个;最后一个字符是任意小写字母;中间两个字符是任意数字
re_str = r'[1-5]\d\d[a-z]'
result = fullmatch(re_str, '211b')
print(result)
10 [^字符集] - 匹配没有在字符集中的其他任意字符
注意:^放在[]的最前面才表示匹配不在字符集中的其他任意字符;如果它不放在[]的最前面,就表示本身是个字符
匹配一个字符串,第一个字符只要不是abc中的一个,其他的字符都可以,后面123
re_str = r'[^abc]123'
result = fullmatch(re_str, '啊123')
print(result)
# 第一个字符是'a','b','c',或者^ 中的任意一个
re_str = r'[abc^]123'
result = fullmatch(re_str, '^123')
print(result)
11 转义符号
- a.正则中也可以通过在特殊符号前加''来对符号进行转义,此处切勿将字符串中的转义字符和正则表达式相混淆
- b.除了在中括号中有特殊意义的符号,其他符号放在[]中也是表示符号本身
① '-' : 在中括号中的两个字符之间表示谁到谁;如果想要表示它本身就不要放在两个字符之间
② '^' : 在中括号中的最前面有意义,如果想要表示它本身就不要放在最前面
③ '[]' : 在中括号中要表示[],要加\
re_str = r'\d\d\.\d\d'
print(fullmatch(re_str, '12.34'))
print(fullmatch(r'[.]', '.'))
if __name__ == '__main__':
main()
二、匹配次数
import re
def main():
1 *(匹配0次或者多次)
①字符* - 指定的字符出现0次或者多次(这儿的字符可以是正则符号,也可以是普通字符)
- a* - a出现0次或者多次
- \d* - 任意数字出现0次或者多次
- [a-z]* - 任意小写字母出现0次或者多次
re_str = r'[a-z]*123'
print(re.fullmatch(re_str, 'cz123'))
123前面有0个或者多个字符,并且每个字符都是数字字符
re_str = r'\d*123'
print(re.fullmatch(re_str, '123414123'))
2 + (匹配1次或者多次)
re_str = r'a+123'
print(re.fullmatch(re_str, 'aa123'))
3 ? (匹配0次或者1次)
re_str = r'\+?123'
print(re.fullmatch(re_str, '+123'))
练习:写一个正则表达式能够匹配所有的整数字符串
re_str = r'[+-]?[1-9]\d*'
print(re.fullmatch(re_str, '52532'))
4 {}
{M,N} - 匹配M到N次(最少M次,最多N次)
{M,} - 匹配至少M次
{,N} - 匹配最多N次
{N} - 匹配N次
密码:6-10位,只能包含数字和字母
print(re.fullmatch(r'[a-zA-Z\d]{6,10}', '32rfeswgs3'))
三、分支和分组
1 |(分支)
- 表达式1|表达式2|表达式3 - 先用表达式1进行匹配,匹配成功就成功,不成功使用表达式2去匹配,以此类推。(三个表达式中只要有一个匹配成功就成功,否则匹配失败)
re_str = r'[a-z]{3}|\d{3}'
print(re.fullmatch(re_str, 'das'))
2 () (分组)
-
a.分组 - 将括号中的内容看成一个整体
abc{2} --> abcc
(abc){2} --> abcabc -
b.分组重复 - 在有分组的正则表达式中,可以在分组后面通过\(数字)来重复前面第几个分组匹配到的内容
注意:数字代表需要重复的第几个分组
(\d{2})abc\1 --> 12abc12
"""
re_str = r'(abc){2}'
print(re.fullmatch(re_str, 'abcabc'))
# 重复分组
re_str = r'(\d{2}\.)abc\1'
print(re.fullmatch(re_str, '12.abc12.'))
网友评论