目录
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