正则表达式:
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
# @Time : 2023/5/16 0:47
# @File : 初始正则表达式.py
# @Software: PyCharm
"""
正则表达式:
正则表达式就是一种规则。可以理解为一种匹配的规则。
为什么要有正则表达式:
1:进行匹配 匹配一个人的电话号码,匹配一个人身份证 匹配一台机器的ip地址
2: 进行搜索 爬虫中使用
3:我们进行表单验证时候需要正则表达式
正则规则:(元字符)
第一条规则:本身就是一个字符,就匹配字符串哪一个字符
第二条规则:字符组[字符] 待匹配里面有什么,里面有什么就匹配什么,一个字符组就代表匹配一个字符。
用法:字符组可以使用范围 所有的范围遵循混ASCII码来匹配
[0-9],[a-z],[A-Z]
#[0-9] \d 表示0 到9之间任意一个数据
#在正则表达式里面 \d ---> \ 是转义符,转移了d 让d可以匹配0-9之间所有的数
\w:(word)表示数字字母下划线
\t :表示制表符号 专门
\n :专门匹配换行符号
\s :匹配所有的空格,制表符
\D : 表示所有的非数字
\W:匹配除了字母数字下划线的所有字符
\S:匹配非空格,制表符
[\d] [0-9] \d 没有区别:都是要匹配一位数字
[\D \d] [\W \w] [\S \s] 所有都可以匹配
. 表示除了换行符之外的所有的内容
#[]字符组 [^] 非字符组
#字符组:只要在中括号内所有字符都是符合规则的字符
#非字符组:只要在中括号内所有字符都是不符合规则的字符
# ^ 表示一个字符的开始
# $ 表示一个字符的结束
# ^ $ 约束以匹配的字符串开头或者约束匹配的字符串结尾
# | 匹配遇到相同部分,匹配完成就自动结束,我们一般将长的放在前面,短的放在后面 (或方法)
# () 分组的作用,给定的一部分进行指正则规定分组。
量词: 求十一位数的手机号码,约束字符出现的次数
我们学习量词需要掌握如下:
{n} 表示只能出现n次
{n,}至少出现n次
{n,m}至少出现n次,之多出现m次
? 表示匹配0次或一次 表示可有可无,但是有只能有一个,比如小数点
\ + 表示匹配一次或者多次
\ * 表示匹配0次或者多次 表示可有可无,但是有可以是多个存在
手机号码匹配:1[3-9]\d{9}
至少匹配:1[3-9]\d{9,}
匹配任意的两位整数 \d{2}
匹配任意保留两位的小数: \d.\d{2}
匹配任意保留两位的小数,整数部分有多个 \d+.\d{2}
#匹配零次: \d?
#匹配任意一个整数或小数:\d+.\d+|\d+ 或者 \d+\.?\d+
#贪婪匹配:
\d{7,12} 总是在符合量词的范围内尽量多匹配,匹配越多越好
#回溯算法:在正则表达式里面的贪婪匹配,里面实现回溯算法。
#修改贪婪模式:非贪婪匹配:惰性匹配:总是匹配符条件范围内尽量小的字符串 :\d{3,4}? 非贪婪模式
#\d+?3 以3结尾就结束。一遇到3就会结束。
#.*?x 匹配任意的内容,遇到x就结束。
元字符
元字符 量词
元字符 量词 ? 量词后面表示非贪婪匹配
身份证:
15 位数:全数字, 首位不为0
18位数,前17位数是全数字,首位不能为0,最后一位是x和数字
[1-9](\d{16}[\dx]|\d{14})
[1-9]\d{14}(\d{2}[\dx])?
"""
re模块
import re
ret = re.findall("\d","alex83")
ret1 = re.findall("\d+","alex83")
ret2 = re.findall("^\d+","alex83")
#findall 方法会匹配字符串中所有符合规则的项,返回一个空列表
print(ret)
print(ret1)
print(ret2)
ret4 = re.search("\d+","alexdm12314")
print(ret4)
#匹配成功就返回一个对象,实现group方法。从头到位进行匹配第一个符合条件的项
print(ret4.group())
r = re.match("\d", '1alex83')
r1 = re.match("\d", 'alex83')
#match只能从头开始匹配。如果开头有符合的,才会匹配成功,返回一个对象,否则返回None
print(r.group())
print(r1)
#finditer方法
import re
#finditer 拿到一个迭代器对象,通过for循环来获取迭代器对象的匹配的值。。
ret2 = re.finditer('\d+',"234sdfdf4")
for i in ret2:
print(i.group())
re 模块和分组处理
s1 = '<h1>wahaha</h1>'
s2 = '<a>wahaha ya wahaha</a>'
import re
ret = re.search("<(\w+)>(.*?)</\w+>",s1)
print(ret.group())
print(ret.group(1))
print(ret.group(2 ))
#我们可以对想要的内容进行分组
ret2 = re.search("<(?P<p1>\w+)>(?P<content>.*?)</\w+>",s2)
#分组取名字
print(ret2)
print(ret2.group())
print(ret2.group('p1'))
print(ret2.group('content'))
#分组命令的规则:(?P<name>正则表达式)
split方法
会按照匹配的正则规则将进行划分
import re
ret = re.split('\d+','bank110obje00jenkins')
print(ret)