正则表达式属一种让一些复杂字符串问题变得简单的工具(正则不是pyth中特有的,所有高
级编程语言都支持的,正则的语法同用)
不管通过正则表达式解决生么问题,写正则表达式的时候都是在使用正则表达式描述字符串规则
def is_tel2(num,str): from re import fullmatch return bool(fullmatch(r'1[3-9]d{9}',num)) python的re模块
re 模块是python中用来支持正则表达式的一个模块,模块中包含了所有和正则相关的函数
fullmatch(正则表达式,字符串):判断正则表达式和指定的字符串是否完全匹配(判断整个字符串是否
符合正则表达式所描述的规则,如果匹配成功返回匹配对象,匹配失败就返回None)
from re import fullmatch#功能导入正则表达式语法 匹配类符号
# 1,普通符号 在正则表达式中表示符号本身的符号 result = fullmatch(r'abc','abc') print(result) # 2, . :匹配任意一个字符 .. 匹配任意两个字符 result = fullmatch(r'a.c','abc') print(result) # 3 d :表示匹配任意一个数字字符 result = fullmatch(r'adc','a0c') print(result) # 4 s :表示匹配任意一个空白字符 # 空白字符:能产生空白效果的字符,例如:空格,换行,水平制表符 result = fullmatch(r'asc','atc') print(result) result = fullmatch(r'ddsac','56 ac') print(result) # D :匹配任意一个非数字字符 result = fullmatch(r'aDc','a$c') print(result) # S 匹配任意一个非空白字符 result = fullmatch(r'aSSSc','a?#$c') print(result) # [字符集]:匹配字符集中任意一个字符
[a-zA-Zd_]匹配字母数字或者下划线
[u4e00-u9fa5]:匹配任意一个中文字符
注意:在[]中减号放在两个字符中间表示谁到谁之间(确定的方式是根据字符编码值大小确定的);如果
减号不在两个字符中间,就表示普通的一个减号
result = fullmatch(r'a[bcxd]l','axl') print(result) result = fullmatch(r'a[u4e00-u9fa5]d','a你d') print(result)[^字符集]:匹配不在字符集中额任意一个字符
result = fullmatch(r'a[^qwer]c','adc') print(result) result = fullmatch(r'a[^qwer]c','aqc') print(result)匹配次数
from re import fullmatch#导入功能 # * :0次或者多次(任意次数)*在谁的后面控制谁的次数 """ d*:0个数字或者多个数字 [字符集]* """ result = fullmatch(r'a*123','123') print(result) result = fullmatch(r'a*123','aa123') print(result) result = fullmatch(r'd*abc','123abc') print(result) result = fullmatch(r'd*abc','abc') print(result) # + :1次或多少次 result = fullmatch(r'a+123','a123') print(result) result = fullmatch(r'a+123','aaaa123') print(result) # ? :0次或者1次 result = fullmatch(r'a?123','123') print(result) result = fullmatch(r'a?123','a123')
# {} """ {M,N}:M到N次 {M,}:最少M次 {,N}:最多N次 {N}:N次 """ result = fullmatch(r'a{1,3}123','a123') print(result) result = fullmatch(r'a{1,3}123','aaa123') print(result) result = fullmatch(r'a{3,5}123','aaa123') print(result) result = fullmatch(r'a{5,}123','aaaaaa123') result = fullmatch(r'a{,3}123','aa123') print(result) result = fullmatch(r'a{3}123','aaa123') print(result)练习写一个正则,判断输入的内容是否是合法qq(长:5到12位,第一位不能是0)
# from re import fullmatch # qq = '2217452845' # result = fullmatch(r'[1-9]d{4,11}',qq) # if result: # print('合法') # else: # print('不合法')练习二# 练习:判断输入的内容是否是一个合法的标识符(由字母、数字下划线组成,数字不能开头)
# from re import fullmatch # str1 = '' # result = fullmatch(r'[a-zA-Z_]/d') # print(result)贪婪和非贪婪
""" 当匹配次数不确定的时候(*,+,?,{m,n},{m,},{,n})匹配模式分为贪婪和非贪婪两种,默认是 贪婪的 贪婪:在匹配成功的时候有多种匹配结果,贪婪取最多次数对应的匹配结果(匹配次数不确定的地方,有多 种匹配方式可以匹配成功,贪婪取最多次数) 非贪婪取最少 非贪婪模式:*?,+,??,{m,n}?,{m,}?,{,n}? 注意:如果匹配结果只有一种可能,那么贪婪和非贪婪的结果都一样 """ from re import match#引入 # match(正则表达式,字符串):判断字符串开头是否符合正则表达式描述的规则 result = match(r'a.+b','a你好111111b') print(result) result = match(r'a.+?b','a你好111111b') print(result) result = match(r'a.+b','a1b') print(result)分组和分支
# 分组 () """ 将正则表达式中的一部分作为一个整体进行相关操作 重复 可以在正则表达式中通过m来重复他前面第m个分组的匹配结果 m 只能重复在之前出现的内容,,无法重复在他之后出现的内容 捕获:分为手动捕获和自动捕获,只获取正则表达式中的一部分匹配到的结果 自动捕获:在正则表达式如果有括号就会只捕获括号里的内容 """ from re import fullmatch result = fullmatch(r'(dd[A-Z]{2})+','12AS45FG') print(result) result = fullmatch(r'(d{2})[a-z]1','98k98') print(result) # result= fullmatch(r'(d[a-z])1=2(.123)','1a1ab123b123')会报错 from re import fullmatch, findall#引入自动捕获功能 name = '小明工资8000元,房租1500元,年龄28,' result = findall(r'(d+)元',name) print(result) # 分支 : # 正则1|正则2|正则3.。。。。匹配可以和多个正则中任意一个正则匹配的字符串 # 注意:如果想要正则表达式中的一部分实现多一的效果,变化的部分用分组表示 result = fullmatch(r'd{3}|[a-z]{2}','mk') print(result) result = fullmatch(r'ad{3}|a[a-z]{3}','a111') print(result) result = fullmatch(r'a(d{3}|[a-z]{3})b','a111b') print(result)转义符号:
就是在本身具备特殊功能或者特殊意义的符号前加‘’,让这个符号变成一个普通的符号
匹配任意一个小数的字符串from re import fullmatch result=fullmatch(r'd+.d+','1.2') print(result)匹配任意一个正整数字符串
result = fullmatch(r'+d+','+3568') print(result) result = fullmatch(r'(d+)','(123456789)') print(result)[]里面的转义符号:单独存在有特殊意义的符号(+,?,*。。。等),在【】特殊意义会消失
result = fullmatch(r'd+[.+?*]d+','1.23') print(result)本身在括号中有特殊功能的符号,如果要表示普通符号必须加‘’
result = fullmatch(r'a[^1-2]b','a-b') print(result)j检查类符号:
检测类符号是在匹配成功的情况下,检测检测类符号所在的位置是否符号相关要求
b:检测是否是单词边界 单词边界:可以将两个单词区分开的符号都是单词边界,比如:空白符号,英文标点符号, 字符串开头和字符串结尾from re import findall result = fullmatch(r'abcbsmn','abc mn') print(result)B:检测是否不是单词边界
#^:检查是否是字符串kait result = findall(r'^d+','123456') print(result) result = findall(f'^.+{5}','123456789') print(result)$:检测是否字符串结尾 re模块常用函数
from re import *#功能引导fullmatch(正则表达式,字符串):完全匹配,判断整个字符串是否符合正则表达式描述的规则,匹配成功返回匹配对象,匹配失败返回空 match(正则表达式,字符串):匹配字符串开头,判断字符串开头是否符合正则表达式描述的规则,匹配成功返回匹配对象,匹配失败返回空 search(正则表达式,字符串):获取字符串中第一个能够和正则匹配的子串,能找到返回匹配对象,找不到返回空 findall(正则表达式,字符串):获取字符串中所有满足正则的子串,返回一个列表,列表中的元素是字符串。 # 注意:如果正则表达式中有分组,会针对分组做自动捕获(只获取分组匹配到的结果) finditer(正则表达式,zfc):获取字符串中所有满足正则的子串,返回一个迭代器,迭代器中的元素是每个子串对应的匹配对象 split(正则表达式,zfc):将字符串中所有满足正则的子串作为切割点对字符串进行切割 sub(正则表达式,字符串1,字符串2):将字符串2中所有满足正则的字串都替换成字符串1 匹配对象 直接获取整个正则表达式对应的匹配结果: 匹配对象.group() 手动获取某个分组对应的匹配结果:匹配对象.group(分组数) 获取匹配结果在原字符串中的位置:匹配对象.span() 参数 忽略大小写:(?i) 单行匹配:(?s) 多行匹配:匹配的时候.(点)不能和换行(n)进行匹配,单行匹配就可以