正则表达式#
它是约束字符串匹配某种形式的规则
正则表达式有什么用?
1.检测某个字符串是否符合规则.比如:判断手机号,身份证号是否合法
2.提取网页字符串中想要的数据.比如:爬虫中,提取网站天气,信息,股票代码,星座运势等具体关键字
import re
正则表达式的种类#
正则表达式由一些 [普通字符] 和一些 [元字符] 组成:
(1)普通字符包括大小写字母和数字
(2)元字符具有特殊含义,大体种类分为如下:
1.预定义字符集,字符组
2.量词
3.边界符
4.分组
预定义字符集#
预定义字符集
匹配内容
.
匹配任意字符 ,除了换行符\n
\d
匹配数字
\D
匹配非数字
\w
匹配字母或数字或下划线 (正则函数中,支持中文的匹配)
\W
匹配非字母或数字或下划线
\s
匹配任意的空白符
\S
匹配任意非空白符
\n
匹配一个换行符
\t
匹配一个制表符
[]
匹配中括号内列举的字符
strvar = "sdjfklj234&*(&1"
lst = re.findall("\d" ,strvar)
print (lst)
strvar = "YWERsdf78_&"
lst = re.findall("\D" ,strvar)
print (lst)
strvar = "sadf234_^&*%$^$%你好"
lst = re.findall("\w" ,strvar)
print (lst)
strvar = "sadf234_^&*%$^$%你好"
lst = re.findall("\W" ,strvar)
print (lst)
strvar = " \r "
lst = re.findall("\s" ,strvar)
print (lst)
strvar = " \r 123_*("
lst = re.findall("\S" ,strvar)
print (lst)
strvar = """
今天国庆假期结束了,兄弟们满载 而归,玩的 很困,尽 快调 整.
"""
lst = re.findall(r"\n" ,strvar)
print (lst)
strvar = """
今天国庆假期结束了,兄弟们满载 而归,玩的 很困,尽 快调 整.
"""
lst = re.findall(r"\t" ,strvar)
print (lst)
字符组格式
说明 [默认必须从字符组中选一个]
[...]
匹配字符组中的字符
[^...]
匹配除了字符组内所有内容,之外的所有字符
字符组内容
待匹配字符
匹配结果
说明
[0123456789]
8
True
字符组里枚举的各种字符,必须满足一个,否则返回假,不匹配
[abcdefg]
9
False
由于字符组中没有"9"字符,所以不匹配
[0-9]
7
True
可用 - 表示范围,[0-9] 和 [0123456789]是一个意思
[a-z]
s
True
[a-z]匹配所有的小写字母
[A-Z]
B
True
[A-Z]就表示所有的大写字母
[0-9a-fA-F]
e
True
可以匹配数字,大小写形式的a-f. 该正则可验证十六进制
print (re.findall('a[abc]b' ,'aab abb acb adb' ))
print (re.findall('a[0123456789]b' ,'a1b a2b a3b acb ayb' ))
print (re.findall('a[0-9]b' ,'a1b a2b a3b acb ayb' ))
print (re.findall('a[abcdefg]b' ,'a1b a2b a3b acb ayb adb' ))
print (re.findall('a[a-g]b' ,'a1b a2b a3b acb ayb adb' ))
print (re.findall('a[ABCDEFG]b' ,'a1b a2b a3b aAb aDb aYb' ))
print (re.findall('a[A-G]b' ,'a1b a2b a3b aAb aDb aYb' ))
print (re.findall('a[A-Z]b' ,'a1b a2b a3b aAb aDb aYb' ))
print (re.findall('a[A-z]b' ,'a1b a2b a3b acb ayb adb a[b' ))
print (re.findall('a[a-zA-Z0-9]b' ,'a1b a2b a3b acb ayb adb a[b' ))
print (re.findall('a[0-9a-zA-Z]b' ,'a-b aab aAb aWb aqba1b' ))
print (re.findall('a[0-9][*#/]b' ,'a1/b a2b a29b a56b a456b' ))
print (re.findall('a[^-+*/]b' ,"a%b ccaa*bda&bd" ))
strvar = "a^c a-c a\c"
lst = re.findall(r"a[\^\-\\]c" ,strvar)
print (lst)
print (lst[-1 ])
strvar = r"a\b"
lst = re.findall(r"a\\b" ,strvar)
print (lst[0 ])
量词
用法说明
?
重复0次或1次
+
重复1次或多次 (至少1次)
*
重复0次或多次 (任意次)
重复n次
重复n次或更多次 (至少n次)
重复n到m次
.* .+
贪婪模式匹配 最深度原则
.*? .+?
非贪婪模式匹配
import re
'''1) ? 匹配0个或者1个a '''
print (re.findall('a?b' ,'abbzab abb aab' ))
'''2) + 匹配1个或者多个a '''
print (re.findall('a+b' ,'b ab aaaaaab abb' ))
'''3) * 匹配0个或者多个a '''
print (re.findall('a*b' ,'b ab aaaaaab abbbbbbb' ))
'''4) {m,n} 匹配m个至n个a '''
print (re.findall('a{1,3}b' ,'aaab ab aab abbb aaz aabb' ))
print (re.findall('a{2}b' ,'aaab ab aab abbb aaz aabb' ))
print (re.findall('a{2,}b' ,'aaab ab aab abbb aaz aabb' ))
贪婪算法和非贪婪算法#
"""
匹配符+量词
"""
strvar = "刘能和刘老根和刘罗锅111子222子"
"""
.只匹配一个字符
"""
lst = re.findall("刘." ,strvar)
print (lst)
lst = re.findall("刘.?" ,strvar)
print (lst)
strvar = "刘能和刘老根和刘罗锅111子222子"
lst = re.findall("刘.+" ,strvar)
print (lst)
lst = re.findall("刘.*" ,strvar)
print (lst)
lst = re.findall("刘.{1,20}" ,strvar)
print (lst)
lst = re.findall("刘.*子" ,strvar)
print (lst)
lst = re.findall("刘.??" ,strvar)
print (lst)
lst = re.findall("刘.+?" ,strvar)
print (lst)
lst = re.findall("刘.*?" ,strvar)
print (lst)
lst = re.findall("刘.{1,20}?" ,strvar)
print (lst)
lst = re.findall("刘.*?子" ,strvar)
print (lst)
边界符#
边界符
说明
\b
匹配一个字符的边界
^
匹配字符串的开始
$
匹配字符串的结尾
"word"
"""
卡主左边界:\bw
卡主右边界:d\b
"""
strvar = "word old fuck"
lst = re.findall(r"d\b" ,strvar)
lst = re.findall(r".*d\b" ,strvar)
lst = re.findall(r".*?d\b" ,strvar)
print (lst)
lst = re.findall(r"\bw" ,strvar)
print (lst)
lst = re.findall(r"\bw.*" ,strvar)
print (lst)
lst = re.findall(r"\bw.*?" ,strvar)
print (lst)
lst = re.findall(r"\bw.*? " ,strvar)
print (lst)
lst = re.findall(r"\bw\S*" ,strvar)
print (lst)
"""
^ 写在在字符串的开头,表达必须以某个字符开头
$ 写在在字符串的结尾,表达必须以某个字符结尾
当使用了^ $ 代表要把该字符串看成一个整体
"""
strvar = "大哥大嫂大爷"
print (re.findall('大.' ,strvar))
print (re.findall('^大.' ,strvar))
print (re.findall('大.$' ,strvar))
print (re.findall('^大.$' ,strvar))
print (re.findall('^大.*?$' ,strvar))
print (re.findall('^大.*?大$' ,strvar))
print (re.findall('^大.*?爷$' ,strvar))
print (re.findall('^g.*? ' , 'giveme 1gfive gay' ))
print (re.findall('five$' , 'aassfive' ))
print (re.findall('^giveme$' , 'giveme' ))
print (re.findall('^giveme$' , 'giveme giveme' ))
print (re.findall('giveme' , 'giveme giveme' ))
print (re.findall("^g.*e" ,'giveme 1gfive gay' ))
分组字符#
分组
用法说明
a|b
匹配字符a 或 字符b (如果两个当中有重合部分,把更长的那个放前面)
(ab)
匹配括号内的表达式 ,将()作为一个分组
\num
引用分组num匹配到的字符串
(?P)
给分组命名
(?P=name)
引用别名: 把name分组所匹配到的内容引用到这里
import re
print (re.findall('.*?_good' ,'wusir_good alex_good secret男_good' ))
print (re.findall('(.*?)_good' ,'wusir_good alex_good secret男_good' ))
print (re.findall('(?:.*?)_good' ,'wusir_good alex_good secret男_good' ))
import re
strvar = "abceab"
lst = re.findall("a|b" ,strvar)
print (lst)
strvar = "abcdeabc234f"
lst = re.findall("abcd|abc" ,strvar)
print (lst)
strvar = "3.... ....4 .3 ...3 1.3 9.89 10"
lst = re.findall(r"\d+\.\d+" ,strvar)
print (lst)
lst = re.findall(r"\d+\.\d+|\d+" ,strvar)
print (lst)
'''findall优先显示括号里的内容,需要加上?:取消哦优先显示,按照匹配到的内容显示'''
lst = re.findall(r"\d+(?:\.\d+)?" ,strvar)
print (lst)
strvar = "13566668888 17366669999 17135178392"
lst = re.findall(r"(?:135|171)\d{8}" ,strvar)
print (lst)
strvar = "13566668888"
lst = re.findall(r"^(?:135|171)\d{8}$" ,strvar)
print (lst)
strvar = "13566668888"
obj = re.search(r"^(135|171)\d{8}$" ,strvar)
print (obj)
print (obj.group())
print (obj.groups())
反向引用#
import re
strvar = "<div>明天又要休息了<div>"
obj = re.search("<(.*?)>(.*?)<(.*?)>" ,strvar)
obj = re.search(r"<(.*?)>(.*?)</\1>" ,strvar)
print (obj)
print (obj.group())
print (obj.groups())
strvar = " z3d4pzd a1b2cab "
obj = re.search(r"(.*?)\d(.*?)\d(.*?)\1\2" ,strvar)
print (obj)
print (obj.group())
print (obj.groups())
命名分组#
"""
3) (?P<组名>正则表达式) 给这个组起一个名字
4) (?P=组名) 引用之前组的名字,把该组名匹配到的内容放到当前位置
"""
strvar = " z3d4pzd a1b2cab "
obj = re.search(r"(?P<tag1>.*?)\d(?P<tag2>.*?)\d(?P<tag3>.*?)\1\2" ,strvar)
print (obj)
print (obj.group())
strvar = " z3d4pzd a1b2cab "
obj = re.search(r"(?P<tag1>.*?)\d(?P<tag2>.*?)\d(?P<tag3>.*?)(?P=tag1)(?P=tag2)" ,strvar)
print (obj)
print (obj.group())
正则函数#
OBJ的返回#
group#
group(num=0 )
groups#
groups()
修饰符#
strvar = "<h1>大标题</H1>"
pattern = re.compile ("<h1>(.*?)</h1>" , flags=re.I)
obj = pattern.search(strvar)
print (obj.group())
"""单行独立匹配,而不是整体匹配"""
strvar = """
<p>111</p>
<a>222</a>
<strong>333</strong>
"""
pattern = re.compile ("^<.*?>(?:.*?)<.*?>$" , flags=re.M)
lst = pattern.findall(strvar)
print (lst)
strvar = """
give
sdfsdfmefive
"""
pattern = re.compile (".*?five" , flags=re.S)
lst = pattern.findall(strvar)
print (lst)
pattern = re.compile (".*?mefive" , flags = re.S|re.I|re.M )
obj = pattern.search(strvar)
print (obj.group())
re.findall#
"""
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
lst = re.findall(正则表达式,字符串)
return list
"""
re.search#
"""
re.search 扫描整个字符串并返回第一个成功的匹配。即找到就返回
return obj
re.search(pattern, string, flags=0)
obj.出group 或者 groups 获取返回值
"""
re.match#
"""
search在正则表达式的前面加上^ 等价于 match ,其他用法上一模一样
"""
re.split#
strvar = "alex|wusir_xboyww@risky"
lst = re.split("[|_@]" ,strvar)
print (lst)
strvar = "alex2341273894wusir234234xboyww11111risky"
lst = re.split("\d+" ,strvar)
print (lst)
re.sub#
strvar = "alex|wusir_xboyww@risky"
"""
strvar = strvar.replace("|","&")
strvar = strvar.replace("_","&")
strvar = strvar.replace("@","&")
print(strvar)
"""
res = re.sub("[|_@]" ,"&" ,strvar)
res = re.sub("[|_@]" ,"&" ,strvar,1 )
print (res)
re.subn#
res = re.subn("[|_@]" ,"&" ,strvar)
res = re.subn("[|_@]" ,"&" ,strvar,2 )
print (res)
re.finditer#
from collections import Iterator, Iterable
strvar = "sdf23647fdgdfg()*()*23423423"
it = re.finditer("\d+" ,strvar)
print (isinstance (it,Iterator))
for obj in it:
print (obj.group())
re.compile#
"""
正常情况下,正则表达式编译一次,执行一次
为了避免反复编译,节省时间空间,可以使用compile统一规则
编译一次,终身受益
第二个参数带有flag
"""
strvar = "asdfs234sdf234"
pattern = re.compile ("\d+" )
print ("<===>" )
obj = pattern.search(strvar)
print (obj.group())
lst = pattern.findall(strvar)
print (lst)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步