python进阶11 正则表达式
python进阶11 正则表达式
一、概念
#正则表达式主要解决什么问题? #1、判断一个字符串是否匹配给定的格式,判断用户提交的又想的格式是否正确 #2、从一个字符串中按指定格式提取信息,抓取页面中的图片数据 res =re.findall(r'^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.cpm$','121212312@qq.com')#看看右边的邮箱是否匹配左边的格式 #注意:如果正则表达式中适用了小括号,namefindall函数匹配的只会是括号内的内容,而不是完整的匹配,可以利用这种机制来对需要的部分进行数据提取 res=re.findall(r'<img src="data:image/png;base64,(.*?)>',html)#在HTML页面中匹配base64数据
二、元字符
#什么是元字符 #本身具有特殊含义的字符
通配元字符
#表示任意一个字符 import re res=re.findall(r'a','abcae')#去去右边字符串中寻找所有满足左边格式的子字符串1 print(res) #输出['a','a'],只要能找到,我们就认为“匹配” res=re.findall(r'a.','abcae')#输出['ab','ae'],a后面加个任意字符 res=re.findall(r'a...','abcaecc')#输出['abca'],关于重复,只能输出前面的,原因是字符不能重复利用
锚点元字符
#锁定行首 ^ #锁定行位 $ #指定边界 \b res=re.findall(r'^a','abcae') #以a为行首的匹配 print(res) #输出ab res=re.findall(r'a.$','abcae') #以.为行尾的匹配 print(res) #输出ae res=re.findall(r'\bab\b','ab abcd')#ab两边都是边界的匹配 print(res) #输出['ab']
重复元字符
#我匹配要求是一个字符可能会连续重复 #{}表示将前面紧挨的字符重复n次 res = re.findall(r'ab{3}c','abbbc')#左边b{3}相当于bbb res = re.findall(r'ab{2,4}c','abbbc') #左边要求2到4个b #正则表达式里面不能加空格 res = re.findall(r'ab{2,}c','abbbc')#左边要求至少2个b
#需求:a接任意个b res = re.findall(r'ab*c','abbbc')#左边任意个b,0-正无穷 res = re.findall(r'ab+c','abbbc')#左边任意个b,1-正无穷 res = re.findall(r'ab?c','abbbc')#左边表示0或1个
重复字符串(非贪婪)
#{} * + ? 这些字符加上?后表示非贪婪,表示尽量给少的键 res = re.findall(r'ab*','abbbc')#不加?号表贪婪 尽可能匹配多的 print(res) #s输出abbb res = re.findall(r'ab*?','abbbc')#加个问号尽可能匹配少的 print(res) #输出ab
选择元字符
#二选一 | 字符类 [...] res = re.findall(r'a(b|d)c','abc-adc-aec') #想匹配出来abc和adc,不要aec,左边的就是表示中间的字符为b或者d res = re.findall(r'a[bd]c','abc-adc-aec') #[]表示想要列举出的所有情况,但是仅仅表示一个字符,输出['abc','adc'],表示选择多个字符的一个 res = re.findall(r'a[^bd]c','abc-adc-aec') #表示除bd以外的所有情况,表示反向 res = re.findall(r'a[b-d0-8]c','abc-adc-aec')#匹配字母b到d,数字0-8的所有情况
字符字面值
#将元字符转义成原来的字符字义 /+元字符 res = re.findall(r'a+c','a+b') #匹配不出来,左边表示a的重复和b res = re.findall(r'a\+c','a+b') #这样就可以了 #将原子符字义转义为有特殊意义的字符 #这便是预定义字符组的由来
三、预定义字符类
#预定义字符类 说明 对等字符组 \d 任意数字字符 [0-9] \D 任意非数字字符 [^0-9] \s 任意空白符 [\t\n\x08\f\r] \S 任意非空白符 [^\t\n\x08\f\r] \w 任意字母数字字符 [a-zA-Z0-9] \W 任意非字母数字字符 [^a-zA-Z0-9]
四、分组
#为对多个字符的组合使用元字符 #分组对于匹配的影响 #对分组进行命名 res =re.findall(r'a(bc)+d','abcbcbcbcd')#为了将bc重复,可以将bc分组 print(res) #['bc'] 原因是只会匹配出()里面的东西 #为了使整个部分匹配出来,可以将整个部分括起来 res =re.findall(r'(a(bc)+d)','abcbcbcbcd') print(res) #[('abcbcbcbcd','bc')]
res =re.findall(r'a(b|c)d','abc-acc-adc-aec')可以通过分组来实现a[bc]c
#按组提取数据 res =re.findall(r'\w+-\w+-\w+-\w+','abc-acc-adc-aec') print(res)# 输出['abc-acc-adc-aec'] #如果不想要这个 - res =re.findall(r'(\w+)-(\w+)-(\w+)-(\w+)','abc-acc-adc-aec')
#给分组命名 res =re.search(r'(?P<year>\d+)-(?P<mouth>\d+)-(?P<date>\d+)','2018-03-11') print(res.groupdict())#输出('day':'11','mouth':'03','year':'2018')
五、总结
#正则表达式是一种一种通用的用来简洁的表达一组字符串的格式或规则,因此,正则表达式与python无关 #通过正则表达式可以去匹配现有的字符串 #通过正则匹配可以迅速过滤出我们需要的全部的或者部分字符串,泳衣查找文本中的特质值等等