模板

re模块

可以结合正则表达式去用

正则表达式就是一堆符号,英文符号,小写大写或者键盘上的一些特殊符号,这写符号拼在一起称为一种规则

然后规则去大字符串当中筛选符合规则的

re.findall

 print(re.findall('abc','abcxxxxabcakejsiabcngk '))
# abcxxxxabkejsingk   #大字符串
# abc   #正则表达式
>>>['abc', 'abc', 'abc']

\w 字母数字下划线 \W除了字母数字下划线

print(re.findall('\w','hello_123 * -+ '))
>>>['h', 'e', 'l', 'l', 'o', '_', '1', '2', '3']
#字母数字下划线

print(re.findall('\W','hello_123 * -+ '))
>>>[' ', '*', ' ', '-', '+', ' ']
#除了数字字母下划线

print(re.findall('a\wb','a1b a_b a+b a-b aab aaaaab'))
>>>['a1b', 'a_b', 'aab', 'aab']
#a和b直接字母数字下划线

\s看不见的符号 空白字符 \S非空白字符

print(re.findall('\s','a b  \n\tc123'))
>>>[' ', ' ', ' ', '\n', '\t']
#看不见的符号   空白字符


print(re.findall('\S','a b  \n\tc123'))
#非空白字符

\d数字 \D非数字

 print(re.findall('\d','a b  \n\tc123'))
 >>>['1', '2', '3']
 #数字
    
 print(re.findall('\D','a b  \n\tc123'))
 >>>['a', ' ', 'b', ' ', ' ', '\n', '\t', 'c']
 #非数字

^从头开始匹配 $从尾部开始匹配

# ^从头开始匹配
print(re.findall('^a\wb','a1b a_b a+b a-b aab aaaaab'))
>>>['a1b']

#$从末尾开始对
print(re.findall('a\wb$','a1b a_b a+b a-b aab aaaaab'))
>>>['aab']


#和\A...\Z的区别
print(re.findall('^egon$','egon'))
>>>['egon']
print(re.findall('\Aegon\Z','egon'))
>>>['egon']
#没有换行符的时候作用是一样的

#当在多行中的时候这俩取到的是空   作用也是一样的
print(re.findall('^egon$',"""
egon
egon123
egon
"""))
>>>[]

print(re.findall('\Aegon\Z',"""
egon
egon123
egon
"""))
>>>[]

#但是加入re.M忽略换行后   \A..\Z会忽略re.M的作用

print(re.findall('^egon$',"""
egon
egon123
egon
""",re.M))
>>>['egon', 'egon']

print(re.findall('\Aegon\Z',"""
egon
egon123
egon
""",re.M))
>>>[]

\n换行符

print(re.findall('\n','a\nb\nc'))
>>>['\n', '\n']
#换行符

\t制表符

print(re.findall('\t','a\tb\nc'))
>>>['\t']
#制表符

.代表任意类型 (不包括不可见类型)

加上re.DOTALL 就也包括了像换行符之类的不可见类型

print(re.findall('a.c','a1c a2c aAc a+c a\nc aaaac'))
>>>['a1c', 'a2c', 'aAc', 'a+c', 'aac']

print(re.findall('a.c','a1c a2c aAc a+c a\nc aaaac',re.DOTALL))
>>>['a1c', 'a2c', 'aAc', 'a+c', 'a\nc', 'aac']

[]在正则表达式中的作用

指定字符

print(re.findall('a[1+]c','a1c a2c aAc a+c a\nc aaaac',re.DOTALL))
>>>['a1c', 'a+c']
#指满足a和c中间有一个符号  1 或者+
print(re.findall('a[1-]c','a1c a2c aAc a+c a-c a\nc aaaac',re.DOTALL))
>>>['a1c', 'a-c']
#指满足a和c中间有一个符号  1 或者-

指定范围

print(re.findall('a[0-9]c','a1c a2c aAc a+c a\nc aaaac',re.DOTALL))
>>>['a1c', 'a2c']
print(re.findall('a[a-z]c','a1c a2c aAc a+c a\nc aaaac',re.DOTALL))
>>>['aac']
print(re.findall('a[A-Z]c','a1c a2c aAc a+c a\nc aaaac',re.DOTALL))
>>>['aAc']
print(re.findall('a[0-D]c','a1c a2c aAc a+c a-c a\nc aaaac',re.DOTALL))
>>>['a1c', 'a2c', 'aAc']

#这里看出- 有另一个作用是为了标记范围  只在两个符号之间有效
当不在两个符号之间时候 就指定-这个符号
print(re.findall('a[+*/-]c','a+c a-c a*c a/c a1c a9c aAc'))
>>>['a+c', 'a-c', 'a*c', 'a/c']

加上^
print(re.findall('a[^+*/-]c','a+c a-c a*c a/c a1c a9c aAc'))
#除了+ * / -  以外
>>>['a1c', 'a9c', 'aAc']

? 左边那 “一个”字符出现0次或者1次 会匹配出来

print(re.findall('ab?','b a ac aed abbbbbbbbbb ab'))
>>>['a', 'a', 'a', 'ab', 'ab']
根据规则匹配a  或者a后面没有跟b  或者a后面跟了b但是无论几个只保留一个匹配粗来

“ * ”左边那一个字符出现0次或者无穷次

print(re.findall('ab*','b a ac aed abbbbbbbbbb ab'))
>>>['a', 'a', 'a', 'abbbbbbbbbb', 'ab']

“ + ”左边那一个字符出现1次或者无穷次

print(re.findall('ab+','b a ac aed abbbbbbbbbb ab'))
>>>['abbbbbbbbbb', 'ab']

{n,m} 左边那一个字符出现n次到m次

print(re.findall('ab{2,4}','b a ab abb abbb abbbb abbbbb abbbbbb abbbbbbbbbb ab'))
>>>['abb', 'abbb', 'abbbb', 'abbbb', 'abbbb', 'abbbb']


#{n,m}
可以取代以上 ? * + 三种用途  0或者1   0或者无穷 1或者无穷
print(re.findall('ab{0,1}','b a abb abbb abbbbbbbbbb ab')) #0或者1
print(re.findall('ab{0,}','b a abb abbb abbbbbbbbbb ab')) #0或者无穷
print(re.findall('ab{1,}','b a abb abbb abbbbbbbbbb ab')) #1或者无穷

贪婪与非贪婪

a开头 .*任意类型0或者无穷  c结束  以最后一个c为结束标准不会中断取值  
就是a 和c中间可以是任意多少个可视符号  但如果c有多个不会第一次匹配到c就停止会一直匹配 到最后一个c  贪婪匹配
print(re.findall('a.*c','a123dsfc+-1234dkjiienflawc'))
# >>>['a123dsfc+-1234dkjiienflawc']
#贪婪
注意.  不包括不可视符号 \n换行符
print(re.findall('a.*c','a123\ndsfc+-1234dkjiienflawc'))
# >>>['awc']
加上re.DOTALL   就包括\n 等特殊定义符
print(re.findall('a.*c','a123\ndsfc+-1234dkjiienflawc',re.DOTALL))
# >>>['a123\ndsfc+-1234dkjiienflawc']

a 开头 .*任意类型 ?0或者1 意思是当取到第一个c就立马结束 不管有多少个c符号
print(re.findall('a.*?c','a123\ndsfc+-1234dkjiienflawc',re.DOTALL))
>>>['a123\ndsfc', 'awc']
#非贪婪

默认分组内容

要求取到网址即可
print(re.findall("'.*?'","< a href='https://www.baidu.com.cn'>'我特么是百度啊'</ a>< a href='https://www.sina.com.cn'>'我特么是新浪啊'</ a>"))
>>>["'https://www.baidu.com.cn'", "'我特么是百度啊'", "'https://www.sina.com.cn'", "'我特么是新浪啊'"]

print(re.findall("href='.*?'","< a href='https://www.baidu.com.cn'>'我特么是百度啊'</ a>< a href='https://www.sina.com.cn'>'我特么是新浪啊'</ a>"))
>>>["href='https://www.baidu.com.cn'", "href='https://www.sina.com.cn'"]
包含了别的字符  ()用这种形式把取出来的值分组  
print(re.findall("href='(.*?)'","< a href='https://www.baidu.com.cn'>'我特么是百度啊'</ a>< a href='https://www.sina.com.cn'>'我特么是新浪啊'</ a>"))
>>>['https://www.baidu.com.cn', 'https://www.sina.com.cn']
#默认留分组内容

取消分组

print(re.findall("href='(.*?)'","< a href='https://www.baidu.com.cn'>'我特么是百度啊'</ a>< a href='https://www.sina.com.cn'>'我特么是新浪啊'</ a>"))
>>>['https://www.baidu.com.cn', 'https://www.sina.com.cn']

print(re.findall("href='(?:.*?)'","< a href='https://www.baidu.com.cn'>'我特么是百度啊'</ a>< a href='https://www.sina.com.cn'>'我特么是新浪啊'</ a>"))
>>>["href='https://www.baidu.com.cn'", "href='https://www.sina.com.cn'"]
#取消分组

这里取消分组没有什么意义  取消分组在特定场景下有独特作用如下
取出字符串内所有数字
print(re.findall('','abac1j3ijii2.41j2k4ij5j1kj2k44444iij2j31n2.4'))
分组特性就是只会展示括号内的符号  所以必须取消阔号 直接去掉效果你可以试一下
print(re.findall('\d+(\.\d+)?','abac1j3ijii2.41j2k4ij5j1kj2k44444iij2j31n2.4'))
# >>>['', '', '.41', '', '', '', '', '', '', '', '', '.4']
用?:取消分组的方式  效果如下
print(re.findall('\d+(?:\.\d+)?','abac1j3ijii2.41j2k4ij5j1kj2k44444iij2j31n2.4'))
# >>>['1', '3', '2.41', '2', '4', '5', '1', '2', '44444', '2', '31', '2.4']

如何取消大字符串中\的特殊意义

print(re.findall('a\\\c','a\c a1c a2c'))
# >>>['a\\c']
第一种用\取消python特殊意思再用\取消掉\的文件中意义
print(re.findall(r'a\\c','a\c a1c a2c'))
# >>>['a\\c']
第二种是r模式 python读入时候会把\当作普通符号 只需要取消用一个\取消\在语法中的特殊意义

re.search

es=re.search('egon','123 egon egon xxx egon')
print(res)
>>><re.Match object; span=(4, 8), match='egon'>

res=re.search('egonxxx','123 egon egon xxx egon')
print(res)
# >>>None

序列化

posted @ 2021-01-06 20:56  williamgess  阅读(180)  评论(0编辑  收藏  举报