【python】re模块

  • 定义:re模块称为正则表达式;
  • 作用:创建一个"规则表达式",用于验证和查找符合规则的文本,广泛用于各种搜索引擎、账户密码的验证等;
  • 预定义字符
\d  匹配所有的十进制数字  0-9
\D  匹配所有的非数字,包含下划线
\s  匹配所有空白字符(空格、TAB等)
\S  匹配所有非空白字符,包含下划线
\w  匹配所有字母、汉字、数字    a-z A-Z 0-9
\W  匹配所有非字母、汉字、数字,包含下划线
  • 特殊字符
1、$:匹配一行的结尾(必须放在正则表达式最后面)

2、^:匹配一行的开头(必须放在正则表达式最前面)

3、*:前面的字符可以出现0次或多次(0~无限)

4、+:前面的字符可以出现1次或多次(1~无限)

5、?:变"贪婪模式"为"勉强模式",前面的字符可以出现0次或1次

6、.:匹配除了换行符"\n"之外的任意单个字符

7、|:两项都进行匹配

8、[ ]:代表一个集合,有如下三种情况
[abc]:能匹配其中的单个字符
[a-z0-9]:能匹配指定范围的字符,可取反(在最前面加入^)
[2-9] [1-3]:能够做组合匹配

9、{ }:用于标记前面的字符出现的频率,有如下情况:
{n,m}:代表前面字符最少出现n次,最多出现m次
{n,}:代表前面字符最少出现n次,最多不受限制
{,m}:代表前面字符最多出现n次,最少不受限制
{n}:前面的字符必须出现n次
  • 匹配方法
s = '我的电话是:10086,女朋友的电话是:10010'

#1、findall():所有结果都返回到一个列表中
ret1 = re.findall('\d+',s)
print(ret1)
#2、finditer():所有结果都返回到迭代器,取数据要用  .group()
ret2 = re.finditer('\d+',s)   #<callable_iterator object at 0x0000024A0FAEB400>
print(ret2)   #<callable_iterator object at 0x0000024A0FAEB400>
for i in ret2:
    print(i.group())

#3、search():返回匹配到的第一个对象(object),对象可以调用group()返回结果
ret3 = re.search('\d+',s)
print(ret3.group())

#4、match():只在字符串开始匹配,也只返回一个对象,没有匹配到就返回 None
ret4 = re.match('\d+',s)
print(ret4)

#5、sub('规则','新字符','旧字符串'):替换
ret5 = re.sub('x.l','xxx','sdakofasldxwlfasfj')
print(ret5)      #sdakofasldxxxfasfj

#6、compile():先把正则表达式编译成一个对象,提高效率,重复使用
res = """
<div class='jay'><span id='1'>周杰伦</span></div>
<div class='ldh'><span id='2'>刘德华</span></div>
<div class='zxy'><span id='3'>张学友</span></div>
<div class='hsbd'><span id='4'>胡说八道</span></div>
"""
obj = re.compile(r"<div class='.*?'><span id='\d+'>.*?</span></div>",re.S)

result = obj.finditer(res)   #re.S  让 . 能匹配换行符
for i in result:
    print(i.group())

#重点,分组
#(?P<分组名称>正则)  可以单独从正则匹配的内容中提取到XX名称的内容
obj1 = re.compile(r"<div class='(?P<yname>.*?)'><span id='(?P<id>\d+)'>(?P<name>.*?)</span></div>",re.S)

result1 = obj1.finditer(res)
for it in result1:
    print(it.group('name'))
posted @ 2023-01-14 23:09  Tony_xiao  阅读(34)  评论(0编辑  收藏  举报