正则表达式

正则表达式的目的:就是匹配字符串用的语言,

字符串中提供的,find(),replace(),split()方法是完全匹配的,而正则表达式进行的而是模糊匹配.

但是在python中使用正则表达式要引入re包,而且正则表达式使用C语言写的一门语言.

正则表达式要先了解什么是元字符.

常用的元字符有: .   ^    $   *   +   ?   {}   []    ()    |    \

import re
#ret = re.findall('w..l','hello world')#元字符  点  表示指代任意的一个字符
#print(ret)

#尖角符  ^
#ret = re.findall('^h...o','hello world')#result:['hello']   尖角符的作用就是只会以字符串的开头进行匹配
#print(ret)

#$符号
#ret = re.findall('........d$','hello world')#$符号表示只会对字符串结尾是d结尾的字符的字符串进行匹配.
#print(ret)

#*重复匹配
#ret = re.findall('l.*d','helloworld')
#这个字符串的意思就是匹配  形式是两头分别是l和d的中间可以是任意字符的字符串而且不管是多少个,假如遇到开头有两个ll
# 结尾有多个ddd的时候,正则表达式总是会进行最多个数的匹配.这个就叫贪婪匹配
#print(ret)#['lloworld']

#+ 也是重复匹配的意思和*是一个意思
#ret = re.findall('l.+d',"helloworld")#重复匹配字符串
#print(ret)#['lloworld']

#?
#ret = re.findall('l?','helloworld')#?匹配?前面的一个字符零次或者一次将匹配到的字符存放到列表中
#print(ret)#['', '', 'l', 'l', '', '', '', '', 'l', '', '']

#{}也是重复匹配的意思
#ret = re.findall('a{4}b','aaaab')#'a{4}b':会去寻找四个a后面是一个b的字符串
#print(ret)#['aaaab']

#当{1,3}的时候表示范围
#ret = re.findall('a{1,4}b','aaaab') #'a{1,4}b'会寻找a的个数是1个至4个的字符串,但是正则表达式是贪婪的总是会匹配允许范围内的最大个数
#print(ret)
#同样上面的重复字符可以这样表示  .* == {0,∞}  + == {0,∞}  ? == {0,1}
#当{1,}后面的数字不写的时候同样表示无穷大
#当使用重复匹配符号的时候推荐使用* 和 ?
#[]
#ret = re.findall('a[c,d]x','acx')#[c,d]表示可以匹配其中的任意一个字符可以是acx  也可以是adx
#print(ret) #acx

#当然[]中可以有多个元素
#倘若[]假如其他的特殊字符,括号中的特殊字符会失去其本身的特殊功能
#但是在[]中这几个字符是例外的,-  \  ^
#例如[a-z]
#ret = re.findall('[a-z]','hello')#[a-z]规则就是从a至z的任意一个字符都可以匹配,将所有结果防止到列表中
#print(ret)#result ['h','e','l','l','o']
#同样也可以是[A-Z],[1-9]
#[^a-z]的意思是匹配a-z的所有字符然后取反,也就是说,匹配除了小写意外的任意一个字符
#[^4,5]的意思是匹配非4非5的任意一个字符

#元字符 \
#\d == [0-9] 所有的数字字符
#\D == [^0-9]所有的非数字字符
#\s 匹配任意的空白字符
#\S 匹配任意的非空白字符
#\w == [a-z,1-9,A-Z]匹配任何的字母和数字
#\W == [^a-z,1-9,A-Z]不匹配字母和数字
#\b 匹配一个单词边界  什么是单词边界呢   例如有句话叫  I am a teacher  此时  I和后面的空格就是一个单词边界
#同理am和后面的空格也是一个单词边界
#ret = re.findall('\d','12344')['1','2','3','4','4']
#print(ret)
#ret = re.findall('\D','1h2f3g')#['h','f','g']
#print(ret)
#ret = re.findall('\s','hello world')#[' ']
#print(ret)
#ret = re.findall('\S','hello world')
#print(ret)#result:['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']
#ret = re.findall('\w','1a2B')
#print(ret)#result:['1', 'a', '2', 'B']
#ret = re.findall('\W','!2aB')
#print(ret)#result:['!']
#ret = re.findall('I\b',r'I\ am a teacher')
#print(ret)

# () 在正则表达式中就是与普通的意思差不多,例如
#ret = re.findall('(as)',"ggasas")
#print(ret)#result:['as', 'as']

# | 表示或的意思
#ret = re.findall('a|3',"asdsds3")
#print(ret)#result:['a', '3']
#假如在正则表达式中想要匹配\符号,就需要使用\\来匹配,原因就是因为python本身就认为\是特殊字符,想要匹配就要使用\先取消\的特殊意义
#例如
#ret = re.findall(r'\\','abc\c')
#print(ret)#result:['\\']
#同样在python中re模块下面还有其他的方法
#re.search();方法的意思是寻找符合匹配条件的第一个结果使用group来拿到结果
#re.match();只在字符串的开始进行匹配,使用group返回一个匹配到的对象

#ret = re.search("l","hello")
#result = ret.group()
#print(result) #l

#ret = re.match('h','hello')
#result = ret.group()
#print(result) #result :h

我嘞个去,学了半天正则表达式,发现单个理解容易,自己用起来发现无从下手.

只能多看一些别人是怎么用的表达式来借鉴借鉴

#test 校验密码的长度正则表达式   ^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
#密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间
#我嘞个去,?= 是尼玛啥意思一下子整蒙了
#ret = re.findall('(?=2)\d','23456') 2
#ret = re.findall('(?=.*)\d','23sadfa') #2,3
#ret = re.findall('(\\d)','234asdf')#['2','3','4']
#ret = re.findall('^(?=.*\d).{4,5}$','1234') #['234aAsdf']
#print(ret)
#靠,终于搞明白了原来是理解错了,
#()内的内容表示的是一个子表达式,()本身不匹配任何东西,也不限制匹配任何东西,只是把括号内的内容作为同一个表达式来处
# 理,例如(ab){1,3},就表示ab一起连续出现最少1次,最多3次。如果没有括号的话,ab{1,3},就表示a,后面紧跟的b出现最
# 少1次,最多3次。另外,括号在匹配模式中也很重要。
#有了上面的理解之后发现^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$这个reg就好理解了
#其实这的主体就是^.{8,10}$   其中的.遵循规则  (?=.*\\d)(?=.*[a-z])(?=.*[A-Z])

#校验中文 ^(\\u4e00-\\u9fa5).{0,}$
#ret = re.findall('^(\\u4e00-\\u9fa5).{0,}$',"我靠".encode("utf-8"))
#print(ret)

#由数字、26个英文字母或下划线组成的字符串
#娘的想骂人了,\w原来是这个作用   \w == [0-9a-zA-z_],尼玛跟看的教程里少说了一个_
#ret = re.findall('^\\w*$','_12_acbA_')
#校验E-Mail 地址
#先要校验emali地址就要先早,emailaddress的规则  字母/数字+@[.....]+'.'+com
#ret = re.findall('^\\w*@(?=q[a-z]).{2}\.com$','178925@qq.com')
#[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?
#print(ret)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值