正则表达式

描述

正则表达式是一门独立的技术,所有的语言都可以使用
它是利用一些特殊符号的组合或者直接写需要查找的字符来产生一些特殊的含义然后去给定的字符串中筛选出符合条件的数据
也就是说正则表达式主要就是用于筛选数据(匹配数据)

字符组

'''字符组的默认匹配方式就是挨个匹配'''
[0123456789]    匹配0到9之间的任意一个数(全写)
[0-9]    匹配0到9之间的任意一个数(缩写)
[a-z]    匹配26个小写的英文字母
[A-Z]    匹配26个大写的英文字母
[0-9a-zA-Z]    匹配数字或小写字母或大写字母

特殊符号

'''特殊符号的默认匹配方式也是挨个匹配'''
.           匹配除换行符以外的任意字符(除换行以外,其他任意字符都可以匹配)
\w(小写)    匹配数字、字母、下划线
\W(大写)    匹配非数字、非字母、非下划线
\d          匹配数字
^           匹配字符串的开头
$           匹配字符串的结尾
# ^和$组合使用可以非常精确的限制匹配的内容
a|b         匹配a或者b
()          给正则表达式分组,不影响表达式的匹配功能
[]          字符组,里面填写的内容默认都是或的关系
[^]         取反,匹配除了字符组里面的其它所有字符

量词

'''正则表达式中默认都是贪婪匹配的,即尽可能多的匹配'''
*           匹配零次或多次  默认就是多次
+           匹配一次或多次  默认就是多次
?           匹配零次或一次  默认是一次,作用不大,主要用于非贪婪匹配
{n}         重复n次
{n,}        重复n次或更多次  默认是多次
{n,m}       重复n到m次  默认是m次
# 量词必须结合表达式一起用不能单独出现,而且量词只影响它左边第一个表达式

贪婪匹配与非贪婪匹配

'''所有的量词都是贪婪匹配,非贪婪匹配只需要在量词的后面问号就可以了'''
eg:
    带匹配的文本
        <hello>hello<hello>
    待使用的正则(贪婪匹配)
        <.*>
    	匹配结果
        	<hello>hello<hello>
    非贪婪匹配
        <.*?>
        匹配结果
        <hello>  <hello>

转义符

'''斜杠与字母的组合有时候有特殊含义'''
\n       匹配的是换行符
\\n      匹配的是文本\n
\\\n     匹配的是换行符
\\\\n    匹配的是文本\\n
在python中可以使用字符串前面加r取消转义

ps: 很多时候我们都不需要自己去写正则表达式,网络上有很多,只需要能够写出简单的正则表达式,能够看懂复杂的正则表达式就行了

re模块

在python中如果想用正则可以考虑使用re模块
import re

操作方法
1.re.findall(正则表达式, 待查找的字符串)
    查找所有符合正则表达式要求的数据,其结果是一个列表
2.re.finditer(正则表达式, 待查找的字符串)
    查找所有符合正则表达式要求的数据,结果是一个迭代器对象
3.re.search(正则表达式, 待查找的字符串)
    匹配到一个符合条件的数据就结束
    查看结果需要用.group()
4.re.match(正则表达式, 待查找的字符串)
    根据正则表达式匹配字符串的开头,如果开头不符合后面就不用看了
    查看结果需要用.group()
5.obj = re.compile(正则表达式)
    当某一个正则表达式需要频繁使用的时候,可以做成模板
    后面使用时直接用模板调re模块方法
    obj.findall(字符串)
6.re.split()  对字符串做分割
    re.split('[ab]', 'abcd') 
    # 先按'a'分割得到''和'bcd',再对''和bcd'分别按'b'分割
7.re.sub('\d', 'H', 'eva3jason4yuan4', 1)
    # 将字符串中的数字替换为'H',1表示只替换1个
8.re.subn('\d', 'H', 'eva3jason4yuan4') 
    将字符串中数字替换成'H',返回元祖(替换的结果,替换了多少次)

re模块补充

1.分组优先
res = re.findall('123(321|456)789', '123456789')
print(res)  # ['456']
findall分组优先展示:优先展示括号内正则表达式匹配到的内容

如果想取消优先展示需要在括号内开头加问号和冒号
res = re.findall('123(?:321|456)789', '123456789')
print(res)  # [123456789]
# 分组优先展示只对find类方法起作用

2.分组别名
res = re.search('123(?P<count>321|456)(?P<end>789)', '123456789')
print(res.group())  # 123456789
print(res.group('count'))  # 456
print(res.group(0))  # 123456789
print(res.group(1))  # 456
print(res.group(2))  # 789
print(res.group('end'))  # 789

posted on 2023-04-05 19:32  zyg111  阅读(44)  评论(0)    收藏  举报