正则表达式

正则表达式
使用特定的表达式来表示一个模板,使待匹配字符串来进行匹配。
正则表达式不属于python中的知识点,只是在python中可以使用正则表达式

正则表达式可以分为两种:
(1)普通字符串
(2)特殊规则的字符串

re.py模块支持正则表达式的使用

import re
# re.search()方法可以使用正则表达式来进行匹配待匹配字符串
re.search(ex,带匹配字符串)
# 第一个参数,正则表达式
# 第二个参数,待匹配字符串

如果正则表达式就是普通的字符串,代表的含义跟 in 一致

r=re.search("abc","dluoejabcrkelgglk")
print(r)
# r:search的返回值,匹配的对象,如果不能匹配,则返回None

正则表达式是特殊字符串

1.字符相关

(1) .代表任意一个单个字符。默认\n不包含在内,如果希望包含\n,可以设置参数re.DOTALL

r=re.search("a.b","epoa-brg;ggkd")
print(r)
>><re.Match object; span=(3, 6), match='a-b'>

修正一下输出的结果,不需要显示这么多

r=re.search("a.b","epoa-brg;ggkd")
if r!=None:
	print(r.group())
else:
	print('不匹配')
>>a-b

字符串例包含\n

r=re.search("a.b","epoa\nbrg;ggkd",re.DOTALL)
if r!=None:
	print(r.group())
else:
	print('不匹配')
>>a
  b

(2)[ ]只要是在[ ]中的字符,任意一个都可以.
在[ ]中如果使用 - ,可以代表从start到end结束
如果希望匹配 - ,则可以使用转义字符 ,表示为-

r=re.search("a[a-z]b","epoacbrg;ggkd")
if r!=None:
	print(r.group())
else:
	print('不匹配')
>>acb

(3)[ ^ ]代表[ ]取反

r=re.search("a[^a\-z]b","epoacbrg;ggkd")
# 表示只要中间不是a - z ,都算匹配成功
if r!=None:
	print(r.group())
else:
	print('不匹配')

(4)\d unicode字符集中的数字

r=re.search("a\db","epoa11brg;ggkd")
if r!=None:
	print(r.group())
else:
	print('不匹配')
>>不匹配
#因为其中11占了两个字符的位置,如果不是11,是1,则匹配成功

(5)\w unicode中的字符,字母数字,下划线

r=re.search("a\wb","epoavbrg;ggkd")
if r!=None:
	print(r.group())
else:
	print('不匹配')

2.次数相关
跟次数相关的内容修饰的是它前面的字符,出现的次数
不能单独使用
(1) * 修饰 *前面的字符,可以出现的次数是: >=0次
*为贪婪匹配(在一次匹配的过程中,尽可能多的进行匹配)

r=re.search("ab*","epoabbbbbbbrg;ggkd")
if r!=None:
	print(r.group())
else:
	print('不匹配')
>>abbbbbbb

(2)+ 修饰的是+前面的字符,可以出现的次数>=1次
+也是贪婪匹配

r=re.search("ab+","epoabbrg;ggkd")
if r!=None:
	print(r.group())
else:
	print('不匹配')
>>ab

(3)?修饰的是?前面的字符,可以出现的次数为0或者1次
也是贪婪匹配

r=re.search("ab?","epoabrg;ggkd")
if r!=None:
	print(r.group())
else:
	print('不匹配')
>>ab

(4)X? ,X代表了跟次数相关的特殊字符,将贪婪匹配变成非贪婪匹配,尽可能少的进行匹配

r=re.search("ab*?","epoabbbbbbbrg;ggkd")
if r!=None:
	print(r.group())
else:
	print('不匹配')
>>a
r=re.search("a.*c","abbbbbbbbbcabbbc;ggkd")
if r!=None:
	print(r.group())
else:
	print('不匹配')
>>abbbbbbbbbcabbbc

r=re.search("a.*?c","abbbbbbbbbcabbbc;ggkd")
if r!=None:
	print(r.group())
else:
	print('不匹配')
>>abbbbbbbbbc
# 第一词匹配成功就取出值 

通过findall匹配出来的内容是多次匹配的内容,列表

r=re.findall("a.*?c","abbbbbbcabbc")
if r!=None:
	print(r.group())
else:
	print('不匹配')
>>['abbbbbbc', 'abbc']

# 想要的部分加个括号()
r=re.findall("a(.*?)c","abbbbbbcabbc")
if r!=None:
	print(r.group())
else:
	print('不匹配')
>>['bbbbbb', 'bb']

3.位置相关
^字符 , 以特定的字符开头,默认不支持多行,如果希望支持多行,可以使用re.MULTILINE也可以缩写为re.M

r=re.search("^张","张三")
if r!=None:
	print(r.group())
else:
	print('不匹配')
>>张

r=re.search("^张","李四")
if r!=None:
	print(r.group())
else:
	print('不匹配')
>>不匹配

r=re.search("^张","1张三丰")
# 必须是以张开头
if r!=None:
	print(r.group())
else:
	print('不匹配')
>>不匹配

"""
detei
张三丰
"""
# 若是这个字符串,结果也是不匹配

r=re.search("^张","detei\n张三丰",re.M)
# 大多数情况下都是加re.M,支持多行
if r!=None:
	print(r.group())
else:
	print('不匹配')
>>

$ 以特殊的字符结尾,结尾是从后往前匹配

r=re.search("com$","http://baidu.com")
if r!=None:
	print(r.group())
else:
	print('不匹配')
>>com

如果仅仅希望获取一部分内容,则可以将希望获取扥内容使用()包裹

r=re.search("http://(.*?)com$","http://baidu.com\nddd http://baidu.com\nddd",re.M)
if r!=None#如果使用search,得到的是匹配对象,如果只希望获得括号中的内容,需要在group中加参数,参数的内容就是第几个括号
	print(r.group(1))
else:
	print('不匹配')
>>baidu.
练习

(1)匹配任意3个字符
明确要找固定位数的一定要加开头和结束,^ $

r=re.search("^.{3}$","dfcio",re.S)
# re.S忽略换行
if r!=Noneprint(r.group())
else:
	print('不匹配')
>>不匹配
r=re.search("^.{3}$","dio",re.S)
# re.S忽略换行
if r!=Noneprint(r.group())
else:
	print('不匹配')
>>dio

(2)匹配电话号码格式的号码,区号(3,4)-电话号码(7,8)

r=re.search("^[0-9]{3,4}-[]0-9]{7,8}$","123-5546289",re.S)
if r!=None:
	print(r.group())
else:
	print("不匹配")
>>123-5546289
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值