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