Python小白,白嫖基地。
一, re模块(正则表达式)
正则表达式是什么:
由一系列特殊字符拼接而成的表达式/规则,该表达式用于从一个大字符串中匹配出符合规则的子字符串
正则表达式:记忆图
正则表达式讲解示例:
1 w 模式匹配字母数字,以及下划线:
s='a b ,t-ie ns2_?(k8' #对象。
print(re.findall('w',f'{s}'))
结果:
['a', 'b', 't', 'i', 'e', 'n', 's', '2', '_', 'k', '8']
2 W模式下匹配非字母,数字,下划线
s='a b ,t-ie ns2_?(k8' #对象。
print(re.findall('W',f'{s}'))
结果:
[' ', ' ', ',', '-', ' ', '?', '(']
3 s模式下匹配任意空白字符,如( , , ,f)
s='a b ,t-ie ns2_?(k8' #对象。
print(re.findall('w',f'{s}'))
结果:
[' ', ' ', ' ']
4 S 模式下匹配非空白字符
ss='a 6k ,1t8y-i s256_?(k798' #对象。
print(re.findall('S',f'{s}'))
结果:
['a', 'b', ',', 't', '-', 'i', 'e', 'n', 's', '2', '_', '?', '(', 'k', '8']
5 d模式下匹配任意数字(0-9) 单个字符匹配
ss='a 6k ,1t8y-i s256_?(k798' #对象。
print(re.findall('d',f'{ss}'))
结果:
['6', '1', '8', '2', '5', '6', '7', '9', '8']
6 D模式下匹配任意非数字
s='a b ,t-ie ns2_?(k8' #对象。
print(re.findall('D',f'{ss}'))
结果:
['a', ' ', 'k', ' ', ',', 't', 'y', '-', 'i', ' ', ' ', 's', '_', '?', '(', 'k']
7. 与
msg="""h e ll
o 123_ (0
1
2
3
"""
print(re.findall('
',msg))
print(re.findall(' ',msg))
print(re.findall(' ',msg))
结果:
['
', '
', '
', '
', '
', '
']
[' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', ' ']
8 ^与$ ^是以什么什么开头,以什么什么结尾
print(re.findall("egon","egon asdf 213123 egonafsadfegon"))#未加标识
print(re.findall("^egon","egon asdf 213123 egonafsadfegon"))#以什么什么开头
print(re.findall("egon$","egon asdf 213123 egonafsadfegon"))#以什么什么结尾
print(re.findall("egon$","egon asdf 213123 egonafsadfegon "))#末尾有空格
print(re.findall("awwwc","ab12c3c a213c"))#以a开头b结尾,中间可以是字母数字,以及下划线
print(re.findall("^awwwc$","ab_2c"))
结果:
['egon', 'egon', 'egon']
['egon']
['egon']
[]
['ab12c', 'a213c']
['ab_2c']
9.1 .(点):代表匹配一个字符,该字符可以是任意字符
print(re.findall("adb","a1b a2b aab aaaaaaab a+b a-b a c"))
print(re.findall("awb","a1b a2b aab aaaaaaab a+b a-b a c"))
print(re.findall("a.b","a1b a2b aab aaaaaaab a+b a-b a b a c"))
print(re.findall("a.b","a1b a2b aab aaaaaaab a b a-b a
b a c"))
#加上 re.DOTALL 可以吧
也给取出来
print(re.findall("a.b","a1b a2b aab aaaaaaab a b a-b a
b a c",re.DOTALL))
结果:
['a1b', 'a2b']
['a1b', 'a2b', 'aab', 'aab']
['a1b', 'a2b', 'aab', 'aab', 'a+b', 'a-b', 'a b']
['a1b', 'a2b', 'aab', 'aab', 'a b', 'a-b']
['a1b', 'a2b', 'aab', 'aab', 'a b', 'a-b', 'a
b']
9.2 []:代表匹配一个字符,我们可以指定该字符的范围
print(re.findall("a[+-]b", "a1b a2b aab aaaaaaab a+b a-b a c"))
print(re.findall("a[.*/+-]b", "a.b a2b a*b a/b aab aaaaaaab a+b a-b a c"))
print(re.findall("a[a-z]b", "a.b a2b a*b a/b aab aaaaaaab a+b a-b a c")) # -放在[]内的开头或结果
print(re.findall("a[a-zA-Z]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c")) # -放在[]内的开头或结果
print(re.findall("adb", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c")) # -放在[]内的开头或结果
print(re.findall("a[0-9]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c")) # -放在[]内的开头或结果
# [^...]代表取反
print(re.findall("a[^0-9]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c")) # -放在[]内的开头或结果
结果:
['a+b', 'a-b']
['a.b', 'a*b', 'a/b', 'a+b', 'a-b']
['aab', 'aab']
['aAb', 'aCb', 'aab', 'aab']
['a2b']
['a2b']
['a.b', 'a*b', 'a/b', 'aAb', 'aCb', 'aab', 'aab', 'a+b', 'a-b']
9.3 *: 左边那个字符出现0次或者无穷次
print(re.findall("ab*","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
结果:
['a', 'ab', 'abb', 'abbbbbbbbbbbb']#遇到空格停止。
9.4 +: 左边那个字符出现1次或者无穷次
print(re.findall("ab+","a ab abb abbbbbbbc bbbabbcbb"))
结果:
['ab', 'abb', 'abbbbbbb', 'abb']
9.5 {n,m}: 左边那个字符出现n次到m次
print(re.findall("ab{0,}","a ab abb abbbbbbcbbbb babbbbbvbbb"))
#与上述的等价
print(re.findall("ab*","a ab abb abbbbbbcbbbb babbbbbvbbb"))
print(re.findall("ab{1,}","a ab abb abbbbbbcbbbb babbbbbvbbb"))
#与上述的等价
print(re.findall("ab+","a ab abb abbbbbbcbbbb babbbbbvbbb"))
结果:
['a', 'ab', 'abb', 'abbbbbb', 'abbbbb']
['a', 'ab', 'abb', 'abbbbbb', 'abbbbb']
['ab', 'abb', 'abbbbbb', 'abbbbb']
['ab', 'abb', 'abbbbbb', 'abbbbb']
9.6 ?: 左边那个字符出现0次到1次
print(re.findall("ab?","a ab abb abbbbbbbbbbbb bbbabbbbb"))
结果:
['a', 'ab', 'ab', 'ab', 'ab']
9.7 .*: 匹配所有
print(re.findall("a.*b","123 a1231-==-000b123123123123123b"))
# .*?: 匹配所有(加上问号不会匹配接下来的b遇到第一个就结束了,防止它过度抓取)
print(re.findall("a.*?b","123 a1231-==-000b123123123123123b"))
结果:
['a1231-==-000b123123123123123b']
['a1231-==-000b']
例1:取地址信息
msg='< a href="https://pan.baidu.com/s/1skWyTT7" target="_blank"><strong><span style="color: #ff0000;">原理图:https://pan.baidu.com/s/1skWyTT7</span></strong></ a>< a href="https://www.baidu/com">"点我啊"</ a>'
print(re.findall('href=".*?"',msg))
print(re.findall('href="(.*?)"',msg))
结果:
['href="https://pan.baidu.com/s/1skWyTT7"', 'href="https://www.baidu/com"']
['https://pan.baidu.com/s/1skWyTT7', 'https://www.baidu/com']
例2:取以a开头b结尾的所有字符串
print(re.findall("a.*b","a1b a+b a-b a
b a b",re.DOTALL))
print(re.findall("a.*b","a1b a+b a-b a
b a b"))
结果:
['a1b a+b a-b a
b a b'] #re.DOTALL可以让*吧
也抓取到
['a1b a+b a-b', 'a b']
10 ():分组
print(re.findall('ab+','ababab123')) #['ab', 'ab', 'ab']
print(re.findall('(ab)+123','ababab123')) #['ab'],匹配到末尾的ab123中的ab
结果:
['ab', 'ab', 'ab']
['ab']
10.1 取消分组
print(re.findall('(?:ab)+123','ababab123'))
#findall的结果不是匹配的全部内容,而是组内的内容,?:可以让结果为匹配的全部内容
结果:
['ababab123']
11 |:或者
print(re.findall("compan(?:ies|y)","Too many companies have gone bankrupt, and the next one is my company'"))
print(re.findall("(d+.?d+)","aslfdasldf1111asdf3333dfadf3.4dafadf3.5555asdfsafd.5555"))
结果:
['companies', 'company']
['1111', '3333', '3.4', '3.5555', '5555']
12.
print(re.findall('a\\c','ac a1c aac'))
#对于正则来说a\c确实可以匹配到ac,但是在python解释器读取a\c时,
#会发生转义,然后交给re去执行,所以抛出异常
print(re.findall(r'a\c','ac a1c aac'))
#对于正则来说a\c确实可以匹配到ac,但是在python解释器读取a\c时,
#会发生转义,然后交给re去执行,所以抛出异常
结果:
['a\c']
['a\c']
12.1re模块提供的方法介绍\ re.search
print(re.findall('e','alex make love') )
#['e', 'e', 'e'],返回所有满足匹配条件的结果,放在列表里
print(re.search('e','alex make love'))
#e,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
结果:
['e', 'e', 'e']
<re.Match object; span=(2, 3), match='e'>
12. 2 .group()
print(re.search("d+.?d*","1.3 aa3.44aaa").group())
print(re.search("d+.?d*","asdfsadf"))
结果:
1.3
None
12.3 分割.split(‘加条件’)
msg="egon:18-male=10"
print(msg.split(':'))
print(re.split('[:=-]',msg))
结果:
['egon', '18-male=10']
['egon', '18', 'male', '10']
面向对象编程思路
面向过程编程
- 核心是过程二字,过程是解决问题的步骤,即先干啥再干啥后干啥
- 基于该思想写程序就是在设计一条条的流水线
优点:复杂的问题流程化、进而简单化
缺点:扩展性差
面向对象编程
- 核心是对象二字,对象是一个用来盛放数据与功能的容器
- 基于该思想写程序就是在整合程序
优点:可扩展性强
缺点:编程的复杂度高