模板

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('awb','a1b a_b a+b a-b aab aaaaab'))
>>>['a1b', 'a_b', 'aab', 'aab']
#a和b直接字母数字下划线

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

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


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

d数字 D非数字

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

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

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

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


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

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

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

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

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

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

换行符

print(re.findall('
','a
b
c'))
>>>['
', '
']
#换行符

制表符

print(re.findall('	','a	b
c'))
>>>['	']
#制表符

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

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

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

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

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

指定字符

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

指定范围

print(re.findall('a[0-9]c','a1c a2c aAc a+c a
c aaaac',re.DOTALL))
>>>['a1c', 'a2c']
print(re.findall('a[a-z]c','a1c a2c aAc a+c a
c aaaac',re.DOTALL))
>>>['aac']
print(re.findall('a[A-Z]c','a1c a2c aAc a+c a
c aaaac',re.DOTALL))
>>>['aAc']
print(re.findall('a[0-D]c','a1c a2c aAc a+c a-c a
c 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']
#贪婪
注意.  不包括不可视符号 
换行符
print(re.findall('a.*c','a123
dsfc+-1234dkjiienflawc'))
# >>>['awc']
加上re.DOTALL   就包括
 等特殊定义符
print(re.findall('a.*c','a123
dsfc+-1234dkjiienflawc',re.DOTALL))
# >>>['a123
dsfc+-1234dkjiienflawc']

a 开头 .*任意类型 ?0或者1 意思是当取到第一个c就立马结束 不管有多少个c符号
print(re.findall('a.*?c','a123
dsfc+-1234dkjiienflawc',re.DOTALL))
>>>['a123
dsfc', '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','ac a1c a2c'))
# >>>['a\c']
第一种用取消python特殊意思再用取消掉的文件中意义
print(re.findall(r'a\c','ac 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

序列化

原文地址:https://www.cnblogs.com/cnblogswilliam/p/14243397.html