Python day23:re模块与面向对象

一、正则表达式
①正则表达式:由一系列特殊字符拼接而成的表达式/规则,该表达式用于从一个大字符串中匹配出符合规则的子字符串
②、常用匹配模式(元字符)
元字符 (参见 python 模块 re 文档)

. 匹配任意字符(不包括换行符)
^ 匹配开始位置,多行模式下匹配每一行的开始
$ 匹配结束位置,多行模式下匹配每一行的结束
* 匹配前一个元字符0到多次
+ 匹配前一个元字符1到多次
? 匹配前一个元字符0到1次
{m,n} 匹配前一个元字符m到n次
\ 转义字符,跟在其后的字符将失去作为特殊元字符的含义,例如\.只能匹配.,不能再匹配任意字符
[] 字符集,一个字符的集合,可匹配其中任意一个字符
| 逻辑表达式 或 ,比如 a|b 代表可匹配 a 或者 b
(...) 分组,默认为捕获,即被分组的内容可以被单独取出,默认每个分组有个索引,从 1 开始,按照"("的顺序决定索引值
(?iLmsux) 分组中可以设置模式,iLmsux之中的每个字符代表一个模式,用法参见 模式 I
(?:...) 分组的不捕获模式,计算索引时会跳过这个分组
(?P<name>...) 分组的命名模式,取此分组中的内容时可以使用索引也可以使用name
(?P=name) 分组的引用模式,可在同一个正则表达式用引用前面命名过的正则
(?#...) 注释,不影响正则表达式其它部分,用法参见 模式 I
(?=...) 顺序肯定环视,表示所在位置右侧能够匹配括号内正则
(?!...) 顺序否定环视,表示所在位置右侧不能匹配括号内正则
(?<=...) 逆序肯定环视,表示所在位置左侧能够匹配括号内正则
(?<!...) 逆序否定环视,表示所在位置左侧不能匹配括号内正则
(?(id/name)yes|no) 若前面指定id或name的分区匹配成功则执行yes处的正则,否则执行no处的正则
\number 匹配和前面索引为number的分组捕获到的内容一样的字符串
\A 匹配字符串开始位置,忽略多行模式
\Z 匹配字符串结束位置,忽略多行模式
\b 匹配位于单词开始或结束位置的空字符串
\B 匹配不位于单词开始或结束位置的空字符串
\d 匹配一个数字, 相当于 [0-9]
\D 匹配非数字,相当于 [^0-9]
\s 匹配任意空白字符, 相当于 [ \t\n\r\f\v]
\S 匹配非空白字符,相当于 [^ \t\n\r\f\v]
\w 匹配数字、字母、下划线中任意一个字符, 相当于 [a-zA-Z0-9_]
\W 匹配非数字、字母、下划线中的任意字符,相当于 [^a-zA-Z0-9_]

③、应用
1、\w匹配字母数字及下划线

print(re.findall('\w',"bs aaah1314ck  a(vdv*acaj")
  1. \W匹配非字母数字下划线
print(re.findall('\W',"bs aaah1314ck  a(vdv*acaj)"))

3、\s匹配任意空白字符,等价于[\t\n\r\f]

print(re.findall('\s','bs aaah1\t314\nck  a(vdv*acaj)'))
print(re.findall('\w\s',"h ello 123_ (0"))

4、\S匹配任意非空字符

print(re.findall('\S','bs aaah1\t314\nck  a(vdv*acaj)'))

5、\d匹配任意数字

print(re.findall("\d",'bs aaah1314ck  a(vdv*acaj)'))

6、\D匹配任意非数字

print(re.findall('\D','bs aaah1314ck  a(vdv*acaj'))
print(re.findall("a\db","a1b a2b a b aab aaaaaaaa1b a2c a22c a 3c"))

7、\n与\t:自己打的回车也算一个\n

msg="""h e\tll\n\no 123_ (0

"""
print(re.findall('\n',msg))
print(re.findall('\t',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("a\w\w\wc","ab12c3c a213c"))
print(re.findall("^a\w\w\wc$","ab_2c"))

9、.与[]
9.1 .:代表匹配一个字符,该字符可以是任意字符

print(re.findall("a\db","a1b a2b aab aaaaaaab a+b a-b a c"))
print(re.findall("a\wb","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"))

.默认匹配除了\n之外的所偶字符,如果要让.也匹配\n需要在后面加上re.DATALL

print(re.findall("a.b","a1b a2b aab aaaaaaab a\tb a-b a\nb a c",re.DOTALL))

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("a\db", "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")) # -放在[]内的开头或结果

9.3 *: 左边那个字符出现0次或者无穷次

print(re.findall("ab*","a ab abb abbbbbbbbbbbb bbbbbbbbb"))

9.4 +: 左边那个字符出现1次或者无穷次

print(re.findall("ab+","a ab abb abbbbbbbbbbbb bbbbbbbbb"))

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

print(re.findall("ab{0,}","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
print(re.findall("ab*","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
print(re.findall("ab{1,}","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
print(re.findall("ab+","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
print(re.findall("ab{2,5}","a ab abb abbb abbbb abbbbbbbb abbbbbbbbbbbb bbbbbbbbb"))

9.6 ?: 左边那个字符出现0次到1次

print(re.findall("ab?","a ab abb abbbbbbbbbbbb bbbbbbbbb"))

9.7 .*: 匹配所有

print(re.findall("a.*b","123 a1231-==-000b123123123123123b"))
print(re.findall("a.*?b","123 a1231-==-000b123123123123123b"))

9.7例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>'
url_pattern = re.compile('href="(.*?)"')
res=url_pattern.findall(msg)
print(res)

res=url_pattern.findall('<a href="www.sina.com.cn"></a>')
print(res)

9.7例2:

print(re.findall("a.*b","a1b a+b a-b a\nb a\tb",re.DOTALL))

10 ():分组

print(re.findall('ab+','ababab123')) #['ab', 'ab', 'ab']
print(re.findall('(ab)+123','ababab123')) #['ab'],匹配到末尾的ab123中的ab

10.1 取消分组

print(re.findall('(?:ab)+123','ababab123')) 
#findall的结果不是匹配的全部内容,而是组内的内容,?:可以让结果为匹配的全部内容

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*","as9fdasl333...4444df1111asdf3333dfadf333.44dafadf3.5555asdfsafd.5555"))
  1. \
print(re.findall('a\\c','a\c a1c aac')) 
#对于正则来说a\\c确实可以匹配到a\c,但是在python解释器读取a\\c时,会发生转义,然后交给re去执行,所以抛出异常
print(re.findall('a\\\\c','a\c a1c aac')) # 正确

④、re模块提供的方法介绍

# ===========================re模块提供的方法介绍===========================
import re
#1
print(re.findall('e','alex make love') ) 
  #['e', 'e', 'e'],返回所有满足匹配条件的结果,放在列表里
#2
print(re.search('e','alex make love').group())
#e,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。

#3
print(re.match('e','alex make love'))    
#None,同search,不过在字符串开始处进行匹配,完全可以用search+^代替match

#4
print(re.split('[ab]','abcd'))     
#['', '', 'cd'],先按'a'分割得到''和'bcd',再对''和'bcd'分别按'b'分割

#5
print('===>',re.sub('a','A','alex make love')) #===> Alex mAke love,不指定n,默认替换所有
print('===>',re.sub('a','A','alex make love',1)) #===> Alex make love
print('===>',re.sub('a','A','alex make love',2)) #===> Alex mAke love
print('===>',re.sub('^(\w+)(.*?\s)(\w+)(.*?\s)(\w+)(.*?)$',r'\5\2\3\4\1','alex make love')) #===> love make alex
print('===>',re.subn('a','A','alex make love')) #===> ('Alex mAke love', 2),结果带有总共替换的个数


#6
obj=re.compile('\d{2}')

print(obj.search('abc123eeee').group()) #12
print(obj.findall('abc123eeee')) #['12'],重用了obj

二、面向对象
面向过程编程
核心是过程二字,过程是解决问题的步骤,即先干啥再干啥后干啥
基于该思想写程序就是在设计一条条的流水线

优点:复杂的问题流程化、进而简单化
缺点:扩展性差

面向对象编程
核心是对象二字,对象是一个用来盛放数据与功能的容器
基于该思想写程序就是在整合程序

优点:可扩展性强
缺点:编程的复杂度高

其实无论怎么编程底层用的也一定是面向过程,并且不是所有场合都适用面向对象。毕竟对于软件来说可扩展性只是衡量的一个标准。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。