1.正则表达式语法
1.什么是正则表达式
用来匹配或者描述字符串的工具。
用处:
a.判断输入的字符串(是否满足某个条件)是否是邮箱/手机号码。是否是ip地址
b.提取满足条件的字符串
c.字符串替换
python中通过re模块中相应的方法来支持正则表达式的匹配、查找、替换等功能
fullmatch(正则表达式,字符串)---> 判断正则表达式和字符串是否完全匹配
正则表达式:就是一个字符串,字符串中是正则表达式语法。r'正则表达式'
正则表达式中包含两个部分,一个是正则语法对应的字符,一个是普通字符
from re import fullmatch
# ----------------------------1. 点-----------------------------------------
"""
. 匹配任意字符。 一个 . 只匹配一个字符
"""
# 匹配一个长度是 3 的字符串,第一个字符是a,第二个字符是任意字符,第三个字符是b
re_str = r'a.b'
result = fullmatch(re_str,r'a\b')
print(result)
# 匹配一个长度是4 ,第一个和最后一个字符是ab 中间两个字符是任意字符的字符串
re_str = r'a..b'
result = fullmatch(re_str,'a11b')
# --------------------------------2. \w---------------------------------
"""
一个\w只能匹配一个字符
"""
# 匹配一个第一个字符是数字字母下划线,后面三各字符是任意字符的字符串
re_str = r'\w...'
result = fullmatch(re_str,'_qqq')
print(result)
# -------------------------------3. \s ------------------------------------
"""
匹配任意空白字符 \s
空白字符指的: 空格 、制表符(Tab缩进)、回车等。都属于空白字符
一个\s 匹配一个空白字符
"""
re_str = r'a\sb'
result = fullmatch(re_str,'a\rb')# \n 是等于换行 \t 制表符 \r等于回车
print(result)
# ------------------------------ 4.\d 匹配数字-----------------------------------
re_str = r'\d\d\d\d'
result = fullmatch(re_str,'1234')
print(result)
# -----------------------------5. \b 检测边界------------------------------------
"""
\b 一个 \b 不会去匹配一个字符,而是单纯的检测 \b 出现的位置是否是单词边界
单词边界:字符串开始和结尾、空格、换行、标点符号等,能将单词隔开的字符
"""
re_str = r'\babc'
re_str = r'abc\b.bbb' # 配一个字符串前三位是abc 第四位是空白 并且要求c的后面是单词边界
result = fullmatch(re_str,'abc bbb')
print(result)
# ----------------------------6 ^ 检测是否是字符串开头------------------------------
"""
^
"""
re_str = r'^\d\d\d' # 判断一个字符串是否是三各数字开头
result = fullmatch(re_str,'123')
print(result)
# ---------------------------------7 $ 检测是否是字符串结尾---------------------------
re_str = r'abc$'
result = fullmatch(re_str,'abc')
print(result)
# --------------------------------8 \W 匹配非字母数字下划线----------------------------
re_str = r'\Wabc'
result = fullmatch(re_str,'@abc')
print(result)
#-----------------------------------9 \S 匹配非空白字符--------------------------------
re_str = r'\S....'
result = fullmatch(re_str,'12345')
print(result)
# --------------------------------10 \D 匹配非数字字符----------------------------------
re_str = r'\D\d\s'
result=fullmatch(re_str,'n2 ')
print(result)
#------------------------------------11 \B 检测是否不是单词边界--------------------------
re_str = r'and\Byou'
result = fullmatch(re_str,'andyou')
print(result)
# -------------------------------------12 [] 匹配中括号中出现的任意一个字符-----------------------
"""
一个[](中括号中是字符集)匹配一个字符 只要匹配到中括号中其中一个字符就行
"""
re_str = r'[abc]aaa'# 匹配一个字符串第一个字符是a或b或c的字符
result = fullmatch(re_str,'aaaa')
print(result)
# ------------------------------------13 [n-m] 匹配n到m中的任意一个字符------------------------
"""
'-' 减号在括号中,如果放在两个字符中间表示范围。也可以用unicode编码
字符n要小于字符m 跟据unicode编码前后
"""
re_str = r'[1-9]\w.'
result = fullmatch(re_str,'1_黑')
print(result)
# 匹配一个字符是字母数字下划线或者是空白
re_str = r'[\w\s]'
result = fullmatch(re_str,'w')
print(result)
# ------------------------------------ 13 [^] 匹配一个不再字符集中的任意字符------------------------------------
"""
[^] ^ 必须放在中括号里的最前面才有效
"""
re_str = r'[^abc]...' # 匹配第一位不是abc中的任何一个的字符串
result = fullmatch(re_str,'sos!')
print(result)
2.正则表达式相关符号
from re import fullmatch
1 *(匹配0次或者多次)
字符*(字符可以是符号也可以是具体字符)--->字符出现0次或者多次
# 匹配0位或者多位的数字字符串
re_str = r'\d*'
print(fullmatch(re_str,'123'))
# 用一个正则表达式来检测一个标识符是否符合要求
# re_str= r'[^0-9]\w*'
re_str = r'[a-zA-Z_]\w*'
print(fullmatch(re_str,'asw_esde'))
2 + (匹配一次或者多次)
字符 + ---> 字符至少有一个或者多个
re_str = r'\d+abc'# 匹配前面一个或者多个数字 后面三各字符是abc
print(fullmatch(re_str,'1213123abc'))
- ? (匹配0次或者1次)
字符 ?
#练习: 写一个正则表达式,匹配所有的整数(123,-2334,+9)
re_str = r'[-+]?[1-9]\d*'
print(fullmatch(re_str,'12'))
- {}(指定次数)
{N} ---> 匹配n次
{M,N}----> 匹配m到n次
{M,}---->至少匹 配M次
{,N}--->最多匹配N次
re_str = r'\d{4,}'
print(fullmatch(re_str,'12345'))
re_str = r'[a-z]{4,6}' # 设置 4到6位的字母密码
print(fullmatch(re_str,'asdwe'))
# 设置一个由数字字母组成的6-16位密码
re_str = r'[\dA-Za-z]{6,16}'
print(fullmatch(re_str,'python1807'))
3.分支和分组
- 分之 |
条件1 | 条件2 ---> 先用个条件1匹配,如果匹配成功就提前匹配成功,并且不会匹配条件2。如果条件1匹配失败,就用
条件2匹配,如果两个都失败就匹配失败
import re
re_str = r'[a-z]{3}|[A-Z]{3}' # 竖线两边的条件独立 。这里时候三各小写或者三个大写。不可大小写混合
re_str = r'a|bsd|aaa'
print(re.fullmatch(re_str,'bsd'))
- () (分组)
a.组合(将括号中的内容作为一个整体进行操作)
b.捕获 ----> 使用带括号的正则表达式匹配成功后,只获取括号中的内容
c.重复---->在正则表达式中可以通过 \数字 来重复前面括号()中匹配到的结果
数字代表的是前面第几个括号,而不是重复次数。
# 组合
# 匹配一个字符串以数字字母组合形式出现3次
re_str = r'((\d[a-zA-Z]){3})'
print(re.fullmatch(re_str,'2k3k4l'))
# 捕获
re_str = r'\d{3}abc'
print(re.findall(re_str,'adas123abc3233abc3e3ad1123abc'))
# findall 先匹配成功后只获取括号里面的内容!
# 重复
re_str = r'([a-z]{3})-(\d{3}\1\2)'
- 转义符号
正则表达式中可以通过在特殊的符号前加 \ 来让特殊的符号没有意义
. ---> 任意字符 \ .---> 字符 .
- ---> 匹配一次或多次 + ---> 字符 +
注意:在中括号中的特殊符号,只能表示它本身
\ 不管在哪都需要转义。 \ 才能表示 \
- 在[]外面没有特殊意义,要在中括号中表示它本身,不能放在两个字符中间
()也需要转义
re_str = r'\d*[555]'
print(re.fullmatch(re_str,'12334555555555'))
4.re模块中函数
- compile
compile(正则表达式字符串)---> 将正则表达式字符串转换成正则表达式对象
import re
re_object = re.compile(r'\d+')
print(re_object)
2.fullmatch 和 match
fullmatch(正则表达式字符串,需要去匹配的字符串)--->用正则表达式去完全匹配字符串。匹配整个字符串
返回匹配对象或者None
match(正则表达式字符串,字符串)--> 不完全匹配。匹配字符串开头,返回匹配对象或者None
result = re.fullmatch(r'\d[a-zA-Z]+','3WEEA')
print(result)
# 结果 1.span ---> 获取匹配成功的开始下标和结束下标区间(开区间)
print(result.span())
print(result.start(0))#获取匹配到的开始下标
2.group---> 获取匹配结果
print(result.group())
group() / group(0) ---> 获取正则表达式完全匹配的结果
group(index>0)--> 正则表达式中第index个分租匹配到的结果
print(re.findall(r'\d[a-zA-Z]+','3WEEAASSAD3dddd'))
3.search
result = re.search(r'(\d)[a-zA-Z]+')
"""
search (正则表达式,字符串)
--->查找字符串中满足正则表达式的第一个字符串,返回值是匹配对象或者None
# 用search匹配出一个字符串中所有的数字字符串
#'abc34sda8923asdad9asda890sd'--->
result = r'\d+'
print(re.findall(result,'abc34sda8923asdad9asda890sd'))
4.findall
findall(正则表达式,字符串)---> 获取字符串中满足正则表达式的所有字串,返回一个列表
注意: 如果正则表达式中国有分组,取值的时候只取括号分组里面匹配的内容
如果有多个分组,就将每个分组匹配到的结果作为一个元组的元素
result = r'(\d+)k([a-dA-D]+)'
print(re.findall(result,'abc34sda8923kasdad9asda890kbcsd'))
- finditer
finiter(正则表达式,字符串)
查找所有满足正则条件的子串,返回值是迭代器,并且迭代器里面的元素是匹配对象
re_str = r'\d+'
str1 = 'abc34kshd8923kabcshd9lkkk890kaa'
result = re.finditer(re_str, str1)
print(result)
for item in result:
print(item)
- split
split(正则表达式,字符串) --> 将字符串按照满足正则表达式条件的子串进行分割
str1 = 'ahsb1sssa8-jjhd7nhs+90nsjhf3-4hhh7+8kjj-'
result = re.split(r'[-+]', str1)
print(result)
7.sub
sub(正则表达式,repl,字符串) --> 将字符串中满足正则表达式条件的子串替换成repl。返回替换后的字符串
str1 = 'hsj8jskfh98ssjj8hshh'
result = re.sub(r'\d+','*', str1)
print(result)
str1 = '智 障,你在干嘛?逼, 后视镜,妈的加扣扣上'
result = re.sub(r'傻\s*叉|逼|fuck|妈的|智\s*障', '*', str1)
print(result)