day17-正则表达式

01-基本符号

1.什么是正则

正则表达式就是一个字符匹配的工具;
是由正则符号和普通字符组成,来匹配不同规律的字符

2.Python队正则表达式的支持

Python中提供了一个re模块,用来支持正则表达式
fullmatch(正则表达式,字符串)-用正则表达式去匹配字符串,如果匹配成功返回匹配结果,失败返回none
Python中正则表达式的写法:将正则内容写在字符串中,一般在这个字符串前面加r/R

import re
1普通字符

普通字符在表达式中代表字符本身

re_str = r'abc'
result = re.fullmatch(re_str,'abc')
print(result)

2 .- 匹配任意字符

在正则表达式中, .出现的位置,可以匹配一个任意字符
注意:一个点只能匹配一个字符

p匹配长度为三的字符串,中间是任意字符

re_str = r'a.c'
result = re.fullmatch(re_str,'a#c')
print(result)

3 \w-匹配字母数字下划线

在正则表达式中,\w出现的位置,可以匹配一个任意字母数字或者下划线(其实也可以匹配Unicode编码中除了阿斯科码剩下的部分)
注意:
一个\w只能匹配一个字符
中文也可以匹配

re_str = r'\wab.'
result = re.fullmatch(re_str,'5abe')
print(result)

4 \s - 匹配空白字符

包括:空格、缩进、制表符和换行符(\r ,\t,\n,空格)

re_str = r'\w\w\s\s..'
result  = re.fullmatch(re_str,'sf\n\ten')
print(result)

5 \d - 匹配数字字符

re_str = r'\d\d\d..'
result = re.fullmatch(re_str,'644du')
print(result)

\b - 检测单词边界

注意:\b 是检测其出现的位置是否是单词边界,不会对字符进行匹配。
当正则表达式中出现了\b,匹配的时候去掉\b,匹配成功后再看其出现的位置是否是单词边界

单词边界:单词开头,单词结尾、标点符号、空白符号(只有能将单词区分开的符号都属于单词边界)

匹配字符串'hello,world',并且要求w 前面是单词边界,h前面也是单词边界

re_str = r'\bhello,\bworld'
result = re.fullmatch(re_str,' hello,wolrd')

7 ^ - 检测字符串开头

在match和fullmatch中没有意义,search、findall等中有意义

re_str = r'^the'
result = re.fullmatch(re_str,'the')

8 $ -检测字符串结尾

在match和fullmatch中没有意义,search、findall等中有意义

re_str = r'the$'
result = re.fullmatch(re_str,'the56')

9 \大写字母 - 对应的功能是\小写字母的功能取反

\W \D \S \B

字符集

1.普通字符集
列如:【abc】- 匹配一个字符是a或b或c

注意:一个中括号只能匹配一个字符
正则中有特殊功能的单个符号,在中括号中表示其本身(.$^+*|)
匹配字符的组合 符号在中括号中保持原有功能\w \b \d \s \W \D \S \B

re_str = r'\d[abcd]'
result = re.fullmatch(re_str,'8d')
print(result)

2.[字符1-字符2]-表示字符1 到字符2(要求:字符1的编码制要小于字符2)
[a-z] - 匹配所有小写字母
[A-Z] - 匹配所有大写字母
[a-zA-Z] - 匹配所有字母
[1-7] - 数字字符1到7
[\u4e00-\u9fa5] - 匹配所有中文
re_str = r'[a-z]'

11 [^字符集]-匹配不在字符集中的任意一个

[^abc]-匹配除了abc以外的任意一个字符
[^\d]-匹配除了数字字符以外的任意一个字符
[^a-z]-匹配除了小写字母以外的任意一个字符

re_str = r'[^abc]'
result = re.fullmatch(re_str,'f')
print(result)

02-正则控制匹配次数

import re

1* - 匹配0次或者多次

a* - a出现0次或多次,'','a','aaa'...都可以匹配
\d* - 任意数字出现0次或多次'','1''23'...都可以
[abc]* - a或b或c
[a-z]* -

注意:在[]外面的*前面需要一个字符或一个匹配字符的符号

print(re.fullmatch(r'a*b','aaab'))
print(re.fullmatch(r'[a-z]*''sdwefrefefw'))

+ 匹配一次或多次

a+ a至少出现一次
\d+ 数字至少出现一次

3.? 匹配0次或一次

a? a出现0次或一次

匹配一个整数
re_str = r'[+-]?[1-9]\d*'

4{}

{N} - 匹配n次,a{3}:匹配3个a
{M,N}-匹配M-n次 a{3,5} - 三个或四个或五个a
{,N} - 最多N次(0-n)
{m,}-至少m次

密码:字母和数字组成,数字不开头,6-12位
re_str = r'[A-Za-z][\dA-Za-z]{5-11}'

03-分支、捕获和贪婪

import re

1.分支

条件1 | 条件2 - 匹配条件1或条件2
\d{2} | [a-z] - 两个数字字符或者一个小写字母
a\d{2} | \w{2} - a后两个数字或者两个数字字母下划线

注意:正则中的分支也会出现短路,当条件1可以匹配,就不会在使用条件2匹配

匹配所有的数,包括正负小数和零

re_str = r'[+-]?[1-9]\d*[.]?\d*|[+-]?0[.]\d+|0'
print(re.fullmatch(re_str,'2'))

2 () - 捕获和分组

分组 - 将括号中的类容作为一个整体

'abc123'
'abcAJS'
re_str = r'abc(\d{3}|[A-Z]{3})'
RE = r'(\d[a-z]){3}'#数字小写字母出现三次

捕获
通过正则获取符合条件的字串的时候,可以在正则表达式中加括号,匹配后取值只取括号中内容

re.findall(正则表达式,字符串) - 在字符串中找所有符合正则表达式的结果,返回列表
取值只取括号中内容

重复匹配
带多个分组的正则表达式可以在分组后面通过添加\数字来重复前面第几个分组中匹配的内容

说明:\数字 - 代表前面第几个分组;\1代表第一个分组

re_str = r'\d{3}([a-z]{2})a\1'
print(re.fullmatch(re_str,'235heahe'))

3.贪婪

匹配次数后加?就是贪婪匹配:*? +? ?? {m,n}? -表示尽可能少的重复

4.转义符号

\w + * ? ( ) [^ -]
在正则表达式中偶特殊意义或特殊功能的符号前加\来取消其特殊意义
\w - 代表两个字符,分别是\ 和w
+ 代表+字符
* 代表*字符

04-re模块

import re

1.compile

compile(正则表达式) - 将正则表达式转换成正则表达式对象
转换成对象后可以通过对象调用对象方法

re_str = '\d{3}'

2.macth/fullmacth

fullmatch(正则表达式,字符串)-完全匹配,从开头到结尾
match(正则表达式,字符串)-不完全匹配,只匹配开头

匹配成功返回匹配对象,失败返回none

匹配对象
1.获取span - 匹配到的内容的范围,(开始下标,结束下标),结束下标取不到
匹配对象.span()-获取整个正则表达式匹配的范围
匹配对象.span(n)-获取整个正则表达式第n个分组匹配到的范围

2.start和end - 获取匹配结果的开始下标和结束下标
匹配对象.start()/匹配对象.end() - 获取匹配结果的开始下标和结束下标
匹配对象.start(n)/匹配对象.end(n)-获取整个正则表达式第n个分组匹配到的开始下标和结束下标

3.group - 获取匹配到的内容
匹配对象.group()-获取整个正则表达式匹配的内容
匹配对象.group(n)-获取整个正则表达式第n个分组匹配到的内容

4.string - 获取用来匹配的原字符串
匹配对象.string

3.search

search(正则表达式,字符串)-匹配字符串中第一个满足正则表达式的字串,匹配成功返回匹配对象,不成功返回none
有多个只匹配第一个

4.split

split(正则表达式,字符串)-在字符串中按照满足正则表达式的字串对字符串进行切割
返回值是个列表

5.sub

sub(正则表达式,新字串,字符串)-用新串替换字串,返回一个替换后的字符串

6.findall

findall(正则表达式,字符串)-在字符串中获取满足正则表达式的所有字符,返回一个列表,元素是字符串

注意:如果正则表达式中有一个分组,结果是表达式中那个分组匹配到的结果
如果表达式中分组个数大于1,结果是一个列表,元素是元组,元组中内容是匹配到的内容

6.finditer

finditer(表达式,字符串)- 获取字符串中表达式的内容,返回一个迭代器,元素是匹配对象

你可能感兴趣的:(day17-正则表达式)