标签:面向对象 下标 增加 设计模式 group ack 非贪婪 pytho css
正则表达式
1.作用
正则(Regular Expression) : 表达对数据的匹配 过滤 提取逻辑的表达式
? 从头开始匹配 如果某一个匹配失败 整体就失败了
? 如果匹配成功 返回匹配结果对象
? 如果匹配失败 返回None
获取匹配结果
? 匹配结果对象.group()
"强烈"建议:
1. . 字符
点字符 : 代表匹配任意一个字符 默认除了 \n
re.S模式可以让 . 匹配\n : re.match(r"\d{3,5}.+", "123\nqq", "re.S")
\. 与字符 点 相同 多用于在匹配邮箱时候使用
2. [] 匹配字符
[] : 匹配其中任意一个字符
[0-9] : 是指 0 - 9 的范围
[^0-9] : 取反 禁止匹配
3. \d \w \s字符
\d : 数字字符
\w : 单词字符[0-9a-zA-Z_]
在py3 中 Unicdode \w 可以匹配汉字
在py2 中 Ascll \w不能匹配汉字
\s : 空白字符
1.{}字符 : 匹配{m,n}, 至少m次 之多n次, {m}m次
2.*字符 : 任意次
3.+字符 : 至少一次
4.?字符 : 0次或者1次
1.分组
目的 : 提取出想要的部分
2.匿名分组
创建: "(正则)"
? 用户创建的分组从1开始 0号分组已经存储整体结果
获取分组结果:
? 匹配结果对象.group(分组编号=0)
? .group(编号,编号)
分组引用:
? 希望在正则的后续位置使用前面的分组匹配的数据
? \分组的编号
re.match(r"嫦娥(\d+)号", "嫦娥998号").group() re.match(r"嫦娥(\d+)号", "嫦娥998号").group(0) re.match(r"嫦娥(\d+)号", "嫦娥998号").group(1) re.match(r"嫦娥(\d+)号 998", "嫦娥998号 998").group(1) re.match(r"嫦娥(\d+)号 999", "嫦娥999号 999").group(1) # 上面写 不灵活 每次分组数据不一样全部需要改写 # 如果需要使用前面分组的数据继续匹配 - 分组引用 re.match(r"嫦娥(\d+)号 \1", "嫦娥999号 999").group(1) re.match(r"嫦娥(\d+)号 \1", "嫦娥1999号 1999").group(1) re.match(r"(\d{3,4})-\d{6,8}", "010-000001").group() re.match(r"(\d{3,4})-\d{6,8}", "010-000001").group(1) re.match(r"(\d{3,4})-(\d{6,8})", "010-000001").group(2) re.match(r"(\d{3,4})-(\d{6,8}) \1-\2", "010-000001 010-000001").group(2)
3.命名分组
? 给每个分组起一个名称 编号发送变化不会影响正则的使用
创建
? "(?P<分组名称>正则)"
获取结果
? .group(分组名称)
? * 也可以通过下标访问
创建分组并分组引用
? "(?P<分组名称>正则) (?P=分组名称)"
re.match(r"(?P<area>\d{3,4})-(?P<no>\d{6,8}) (?P=area)-(?P=no)", "010-000001 010-000001").group(1,2) re.match(r"(?P<area>\d{3,4})-(?P<no>\d{6,8}) (?P=area)-(?P=no)", "010-000001 010-000001").group(‘no‘) re.match(r"((?P<area>\d{3,4})-(?P<no>\d{6,8})) (?P=area)-(?P=no)", "010-000001 010-000001").group(‘no‘)
4. | 符号
r"表达式(部分1|部分2|部分3)" 匹配分组中 |左右任意一个表达式
re.match(r"^\w{4,16}@163\.com$", "123456@163.com").group() re.match(r"^\w{4,16}@163\.com$|^\w{4,16}@263\.com$|^\w{4,16}@qq\.com$", "123456@qq.com").group() re.match(r"^\w{4,16}@(163|263|qq)\.com$", "123456@263.com").group()
match(正则,数据) - -> 匹配对象 从头匹配
search(正则,数据) - -> 匹配对象 从头开始搜索 往后面尝试
findall(正则,数据) --> 返回列表 查找所有
sub(正则,替换数据,数据,次数) -- > 替换后的数据
html =""" <div> <p>岗位职责:</p> <p>完成推荐算法、数据统计、接口、后台等服务器端相关工作</p> <p><br></p> <p>必备要求:</p> <p>良好的自我驱动力和职业素养,工作积极主动、结果导向</p> <p> <br></p> <p>技术要求:</p> <p>1、一年以上 Python 开发经验,掌握面向对象分析和设计,了解设计模式</p> <p>2、掌握HTTP协议,熟悉MVC、MVVM等概念以及相关WEB开发框架</p> <p>3、掌握关系数据库开发设计,掌握 SQL,熟练使用 MySQL/PostgreSQL 中的一种<br></p> <p>4、掌握NoSQL、MQ,熟练使用对应技术解决方案</p> <p>5、熟悉 Javascript/CSS/HTML5,JQuery、React、Vue.js</p> <p> <br></p> <p>加分项:</p> <p>大数据,数理统计,机器学习,sklearn,高性能,大并发。</p> </div>""" res = re.sub(r"</?\w+>|\s| ", "", html) print(res)
def add(match_obj): # 获取匹配结果的数据 value = match_obj.group() result = int(value) + 1 # 返回值必须是字符串类型 return str(result) res = re.sub(r"\d{2,3}", add, "python=100 cp=96") print(res)
split(正则,数据) --> 切割后的列表
data = "貂蝉,杨玉环:西施,王昭君 凤姐" res = re.split(r",|:|\s", data) print(res)
1.贪婪和懒惰
?懒惰 尽可能少匹配
贪婪模式变为懒惰模式 量词后加?即可
# html 去直播找源代码 res = re.search(r"https://.+\.jpg", html).group() # 一个结果很长 print(res) # res = re.search(r"https://.+?\.jpg", html).group() # 一个结果很短 # # 理解贪婪模式和非贪婪模式之后 再看下面的代码 # print(res) # res = re.findall(r"https://.+?\.jpg|https://.+?\.png", html) # print(res) # res = re.findall(r"https://.+?\.(?:jpg|png)", html) # print(res) # 取消分组 因为findall的结果默认是用户创建的分组数据 需要取消用户创建的分组从而显示整体结果(?:正则)
# 验证贪婪和懒惰 # res = re.match(r"^(\d+?)(\d+)$", "13546456789").group(1,2) # res = re.match(r"^(\d+?)(\d?)$", "13546456789").group(1,2) # res = re.match(r"^(\d+)(\d?)$", "13546456789").group(1,2) # print(res)
2. r
如果字符串中有双斜杠 正则需要四反斜杠来进行匹配
? 为解决反斜杠困扰问题, 使用r标识数据
? r"\1" ===> "\\1" 自动对数据中的\进行转义 ——> 双反斜杠 \
标签:面向对象 下标 增加 设计模式 group ack 非贪婪 pytho css
原文地址:https://www.cnblogs.com/Mryang123/p/10013646.html