秃顶之路-Day19

Day 19

import re
# findall(正则表达式,字符串) 把符合正则表达式的字符串在列表中返回
# re.findall
# ### 预定义字符集
# \d 匹配数字
strvar='asdfsf*&*^&^232**fkljklfg5'
lst=re.findall(r'\d',strvar)
print(lst)
# \D 匹配非数字
strvar='ksjkejfjt98347895*&*(&*(&*(&#%U'
lst=re.findall(r'\D',strvar)
print(lst)
# \w 匹配字母数字下划线
strvar='sadfasdf**fdd&&23中俄1132___9879)_00089)()9&……'
lst=re.findall(r'\w',strvar)
print(lst)
# \W 匹配非字母数字下划线
strvar='gkdhfgjhdkj(*)(*=---3353153213*&^*^#847'
lst=re.findall(r'\W',strvar)
print(lst)
# \s 匹配任意的空白符(\n \t \r ' ')
strvar='   kjhjkhk            kj  nkj k           -'
lst=re.findall(r'\s',strvar)
print(lst)
# \S 匹配任意非空白符
strvar='afklj  sdfksj '
lst=re.findall('\S',strvar)
print(lst)
# \n 匹配一个换行符
strvar="""

                       
"""
lst=re.findall(r'\n',strvar)
print(lst)
# \t 匹配一个制表符
strvar="""
			
"""
lst=re.findall(r'\t',strvar)
print(lst)
# 字符组[] 必须从字符组列举出来的抽取,默认一个,没有返回空
strvar='abdfrdsfg'
lst=re.findall('[abc]',strvar)
print(lst)
print(re.findall(r'a[abc]b','acb bca aab abb acb acc '))
print(re.findall(r'a[0123456789]b','a8b a5b aeb agb ahb='))
# - 代表到,代表的是范围
# 0-9 => 0123456789
print(re.findall(r'a[0-9]b','a8b a5b aeb agb ahb'))
# a-z
print(re.findall(r'a[a-z]b','a8b a5b aeb agb ahb'))
# 不会单纯的批匹配小写和大写字母和数字,还会匹配到特殊字符号
print(re.findall(r'a[0-z]b','a8b a5b aeb agb a@b'))
# ^ 除了 在字符组当中,开头位置使用,除了它什么都不要
print(re.findall(r'a[^+\-*/]b','a%b cca*ba'))
# 如果想要匹配^ - 需要前面加上\进行转义
lst=re.findall(r'a[\^\-]b','a+b a-b a^b')
print(lst)
# 匹配 \
'''\b 本身也是转义字符:退格(把光标向左移动一位)'''
lst=re.findall(r'a\\b',r'a\b')
print(lst[0])

# ### 正则表达式-多个字符的匹配
# 量词
# 1. ? 匹配0个或者1个
print(re.findall(r'a?b','abbzab abb aab')) # ab b ab ab b ab
# 2. + 匹配1个或者多个
print(re.findall(r'a+b','b ab aaaaaaba abb ab'))# ab aaaaaab ab ab
# 3. * 匹配0个或者多个
print(re.findall(r'a*b','b ab aab abb b aaaaab'))# b ab aab ab b b aaaaab
# 4. {m,n} 匹配m-n个a
print(re.findall('a{1,3}b','aaab ab b aaaaab bbaab'))# aaab ab aaab aab
# {m,} 至少m次 {m}必须m次
print(re.findall('a{2}b','aab aaaba aab aaaaba'))# aab aab aab aab

# 贪婪匹配和非贪婪匹配
'''
贪婪匹配:默认向更多次数匹配(回溯算法)
非贪婪匹配:默认向更少次数匹配
在量词的后面接?
.?? .+? .*? {4,}?
回溯算法:从左向右进行匹配,直到匹配到最后,再也找不到了,回头,找最后一个(递归)
. 匹配任意字符,除了换行符\n
'''
# 贪婪匹配
strvar='刘能和刘老根和刘大拿子111子222'
lst=re.findall(r'刘.',strvar)
print(lst)
lst=re.findall(r'刘.?',strvar)
print(lst)
lst=re.findall(r'刘.+',strvar)
print(lst)
lst=re.findall(r'刘.*',strvar)
print(lst)
lst=re.findall(r'刘.{4,}',strvar)
print(lst)

# 非贪婪匹配
lst=re.findall(r'刘.??',strvar)
print(lst)
lst=re.findall(r'刘.+?',strvar)
print(lst)
lst=re.findall(r'刘.*?',strvar)
print(lst)
lst=re.findall(r'刘.{4,}?',strvar)
print(lst)

# 边界符 \b
'''
\b 本身也是转义字符:退格(把光标向左移动一位)
word
右边界:d\b
左边界:\bw
'''
# 右边界
strvar='word pwd scf'
lst=re.findall(r'd\b',strvar)
print(lst)
lst=re.findall(r'.*d\b',strvar)
print(lst)# ['word pwd']
lst=re.findall(r'.*?d\b',strvar)
print(lst)
# 左边界
lst=re.findall(r'\bw',strvar)
print(lst)
# 要所有w开头的单词
lst=re.findall(r'\bw.*',strvar)
print(lst)#['word pwd scf']
lst=re.findall(r'\bw.*?',strvar)
print(lst)#['w']
lst=re.findall(r'\bw\S*',strvar)
print(lst)# ['word']

# ^ $
'''
^ 匹配字符串的开始(必须以……开头)
$ 匹配字符串的结尾(必须以……结尾)
当使用^和$符号的时候,要把字符串看成整体
'''
strvar='大哥大嫂大爷'
print(re.findall('大.',strvar))
print(re.findall('^大.',strvar))
print(re.findall('大.$',strvar))
print(re.findall('^大.$',strvar))
print(re.findall('^大.*?$',strvar))
print(re.findall('^大.*?大$',strvar))
print(re.findall('^大.*?爷$',strvar))

print(re.findall('^g.*? ' , 'giveme 1gfive gay'))
print(re.findall('five$' , 'aassfive'))
print(re.findall('^giveme$' , 'giveme'))
print(re.findall('^giveme$' , 'giveme giveme'))
print(re.findall('giveme' , 'giveme giveme'))
print(re.findall("^g.*e",'giveme 1gfive gay'))

# ### 正则表达式-匹配分组()
# 分组练习(圆括号)
print(re.findall(r'.*?_good','wusir_good alex_good secretmen_good'))
# ()优先显示括号里面的内容
print(re.findall('(.*?)_good','wusir_good alex_good secret_good'))
# ?: 取消显示括号里面的内容
print(re.findall('(?:.*?)_good','wusir_good alex_good secret_good'))\
# | 代表或, a|b匹配字符a或者匹配字符b,把字符串长的写在前面,把字符串短的的写后面
strvar='abcdefg'
lst=re.findall('a|b',strvar)
print(lst)
'''在使用|的时候,把不容易匹配的字符串放在前面,把容易匹配到的放在后面'''
strvar='abcggkgkgkjabacabcdwerwer'
lst=re.findall('abc|abcd',strvar)#['abc','abc']
lst=re.findall('abcd|abc',strvar)#['abc','abcd']
print(lst)
# 练习
strvar='.34 ... 78.  72  78.12  6.3  .3 .56.3'
# 匹配小数
lst=re.findall(r'\d+\.\d+',strvar)
print(lst)
# 匹配小数和整数
lst=re.findall(r'\d+\.\d|\d+',strvar)
print(lst)
# 分组来表达小数和整数
lst=re.findall(r'\d+(?:\.\d+)?',strvar)
print(lst)
# 匹配135或171的手机号

lst=re.findall(r'(?:135|171)\d{8}',strvar)
print(lst)
# 用^ $ 卡死长度,只能是一个手机号,不能是多个
strvar='13588889999'
lst=re.findall(r'^(?:135|171)\d{8}$',strvar)
print(lst)
# 匹配www.baidu.com 或者 www.oldboy.com
strvar='www.baidu.com www.lagou.com www.oldboy.com'
lst=re.findall(r'(?:www)\.(?:baidu|oldboy)\.(?:com)',strvar)
print(lst)
'''
findall 是把符合条件的内容都匹配出来放在列表里
		不能够把匹配到的结果和分组当中的内容显示在同意界面之中
search  按照正则表达式,把第一次匹配到的返回出来,返回的是对象
		能够把匹配的结果和分组当中的内容显示出来
对象.group 返回的是匹配到的结果
对象.groups返回的是括号分组里面的内容	
如果匹配不到内容,返回的是None,无法调用group和groups方法	
'''
strvar='www.baidu.com www.lagou.com www.oldboy.com'
obj=re.search(r'www\.(baidu|oldboy)\.com',strvar)
# print(obj)
# 返回的是匹配到的结果
res=obj.group()
print(res)
# 通过group和下标可以获取到括号的内容
print(obj.group(1))
# print(obj.group(2))

# ### 命名分组
strvar='<div>今天天气不错~</div>'
lst=re.findall('<(.*?)>(.*?)<(.*?)>',strvar)
print(lst)
# 反向引用:把匹配到的值再引用一次
lst=re.findall(r'<(.*?)>(.*?)<(/\1)>',strvar)
print(lst)
# \1 代表反向引用第一个括号 \2代表反向引用第二个括号
strvar='a1b2cab'
obj=re.search(r'(.*?)\d(.*?)\d(.*?)\1\2',strvar)
res1=obj.group()
print(res1)
res2=obj.groups()
print(res2)
# 命名分组
'''
(?P<组名>正则表打式)给这个组起一个名字
(?P=组名)引用之前组的名字,把改组名匹配到的内容放在当前位置
'''
# 方法一
strvar='a1b2cab'
obj=re.search(r'(?P<tag1>.*?)\d(?P<tag2>.*?)\d(?P<tag3>.*?)\1\2',strvar)
print(obj)
res1=obj.group()
print(res1)
res2=obj.groups()
print(res2)
# 方法二
obj=re.search(r'(?P<tag1>.*?)\d(?P<tag2>.*?)\d(?P<tag3>.*?)(?P=tag1)(?P=tag2)',strvar)
res1=obj.group()
print(res1)
res2=obj.groups()
print(res2)

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页