re模块,面向对象编程

一.re模块

正则表达式

常用匹配模式:(元字符)

在这里插入图片描述

匹配模式详解

import re

# 1.\w 匹配字母数字下划线(包括中文)
print(re.findall('\w\w\w',"h ello 123_ (0"))
# ['ell', '123']

# 2.\W 匹配非数字字母下划线
print(re.findall('\W',"h ello 123_ (0"))
# [' ', ' ', ' ', '(']

# 3.\s 匹配任意空白字符 等价于\t\n\r\f
print(re.findall('\s',"h e\tll\no 123_ (0"))
# [' ', '\t', '\n', ' ', ' ']
print(re.findall('\w\s',"h ello 123_ (0"))
# ['h ', 'o ', '_ ']

# 4.\S 匹配任意非空白字符
print(re.findall('\S',"h e\tll\no 123_ (0"))
# ['h', 'e', 'l', 'l', 'o', '1', '2', '3', '_', '(', '0']

# 5.\d 匹配任意数字,等价于0-9
print(re.findall('\d',"h e\tll\no 123_ (0"))
# ['1', '2', '3', '0']

# 6.\D 匹配任意非数字
print(re.findall('\D',"h e\tll\no 123_ (0"))
# ['h', ' ', 'e', '\t', 'l', 'l', '\n', 'o', ' ', '_', ' ', '(']

print(re.findall('a\db',"a1b a2b a b aab aaaaaa1b a2c a22c a 3c"))
# ['a1b', 'a2b', 'a1b']

# 7.\n :匹配换行符 与 \t:匹配制表符
msg="""h e\tll\n\no 123_ (0
\t1
	2
3
"""
print(re.findall('\n',msg))
# ['\n', '\n', '\n', '\n', '\n', '\n']
print(re.findall('\t',msg))
# ['\t', '\t', '\t']
print(re.findall(' ',msg))
# [' ', ' ', ' ']

# 8.^:匹配字符串的开头与 $:匹配字符串的末尾
print(re.findall("^egon",'egon asdf 213123 egonafsadfegon'))
# ['egon']
print(re.findall('egon$',"egon asdf 213123 egonafsadfegon "))
# []

print(re.findall('a\w\w\wc',"ab12c3c a213c"))
# ['ab12c', 'a213c']
print(re.findall('^a\w\w\wc$',"ab_2c"))
# ['ab_2c']

# 9, .与[]
# 9.1 .: 代表匹配一个字符,该字符可以是任意字符,除了\n,要想匹配\n,可以加上re.DOTALL
print(re.findall('a\db','a1b a2b aab aaaaaaab a+b a-b a c'))
# ['a1b', 'a2b']
print(re.findall('a\wb','a1b a2b aab aaaaaaab a+b a-b a c'))
# ['a1b', 'a2b', 'aab', 'aab']
print(re.findall('a.b','a1b a2b aab aaaaaaab a+b a-b a b a c'))
# ['a1b', 'a2b', 'aab', 'aab', 'a+b', 'a-b', 'a b']
print(re.findall('a.b','a1b a2b aab aaaaaaab a\tb a-b a\nb a c',re.DOTALL))
# ['a1b', 'a2b', 'aab', 'aab', 'a\tb', 'a-b', 'a\nb']

# 9.2 []:代表匹配一个字符,我们可以指定该字符的范围
# -放在[]内的开头或结尾
print(re.findall('a[+-]b','a1b a2b aab aaaaaaab a+b a-b a c'))
# ['a+b', 'a-b']
print(re.findall('a[.*/+-]b','a.b a2b a*b a/b aab aaaaaaab a+b a-b a c'))
# ['a.b', 'a*b', 'a/b', 'a+b', 'a-b']
print(re.findall('a[a-z]b','a.b a2b a*b a/b aab aaaaaaab a+b a-b a c'))
# ['aab', 'aab']
print(re.findall('a[a-zA-Z]b','a.b a2b a*b a/b aAb aCb aaaaaaab a+b a-b a c'))
# ['aAb', 'aCb', 'aab']
print(re.findall('a\db','a.b a2b a*b a/b aAb aCb aaaaaaab a+b a-b a c'))
# ['a2b']
print(re.findall('a[0-9]b','a.b a2b a*b a/b aAb aCb aaaaaaab a+b a-b a c'))
# ['a2b']

# [^...]代表取反
print(re.findall('a[^0-9]b','a.b a2b a*b a/b aAb aCb aaaaaaab a+b a-b a c'))
# ['a.b', 'a*b', 'a/b', 'aAb', 'aCb', 'aab', 'a+b', 'a-b']

# 9.3 *:左边那个字符出现0次或者无穷次
print(re.findall('ab*','a ab abb abbbbbbbbb bbbbbbbbbb'))
# ['a', 'ab', 'abb', 'abbbbbbbbb']

# 9.4 +:左边那个字符出现1次或者无穷次
print(re.findall('ab+','a ab abb abbbbbbbbb bbbbbbbbbb'))
# ['ab', 'abb', 'abbbbbbbbb']

# 9.5 {n,m}:左边那个字符出现n次到m次
print(re.findall('ab{0,}','a ab abb abbbbbbbbb bbbbbbbbbb'))
print(re.findall('ab*','a ab abb abbbbbbbbb bbbbbbbbbb'))
# ['a', 'ab', 'abb', 'abbbbbbbbb']
print(re.findall('ab{1,}','a ab abb abbbbbbbbb bbbbbbbbbb'))
print(re.findall('ab+','a ab abb abbbbbbbbb bbbbbbbbbb'))
# ['ab', 'abb', 'abbbbbbbbb']

print(re.findall('ab{2,5}','a ab abb abbbbbbbbb bbbbbbbbbb'))
# ['abb', 'abbbbb']

# 9.6 ?: 左边那个字符出现0次到1次
print(re.findall('ab?','a ab abb abbbbbbbbb bbbbbbbbbb'))
# ['a', 'ab', 'ab', 'ab']

# 9.7 .*:匹配所有 ,性格贪婪
print(re.findall('a.*b','123 a1231-==-000b123123123123b'))
# ['a1231-==-000b123123123123b']
# .*后面加上?:代表非贪婪模式
print(re.findall('a.*?b','123 a1231-==-000b123123123123b'))
# ['a1231-==-000b']

# 例1:
# compile() 函数将一个字符串编译为字节代码
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(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>

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

# 例2:
print(re.findall('a.*b','a1b a+b a-b a\nb a\tb',re.DOTALL))
# ['a1b a+b a-b a\nb a\tb']
print(re.findall('a.*b','a1b a+b a-b a\nb a\tb'))
# ['a1b a+b a-b', 'a\tb']

# 10 ():分组,匹配括号内的表达式,也表示一个组
print(re.findall('ab+','ababab123'))
# ['ab', 'ab', 'ab']
print(re.findall('(ab)+123','ababab123'))
#  匹配到末尾的ab123中的ab ==> ['ab']

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

# 11 |:或者,匹配该符号左边的或右边的字符
print(re.findall("compan(?:ies|y)","Too many companies have gone bankrupt, and the next one is my company"))
# ['companies', 'company']
print(re.findall("\d+\.?\d*","as9fdasl333.4444df1111asdf3333dfadf333.44dafadf3.5555asdfsafd.5555"))
# ['9', '333.4444', '1111', '3333', '333.44', '3.5555', '5555']

# 12. \
#对于正则来说a\\c确实可以匹配到a\c,但是在python解释器读取a\\c时,会发生转义,然后交给re去执行,所以抛出异常
# print(re.findall(r'a\c','a\c a1c aac'))
# re.error: bad escape \c at position 1
print(re.findall('a\\\\c','a\c a1c aac'))
# ['a\\c']
print(re.findall(r'a\\c','a\c a1c aac'))
# ['a\\c']

re模块提供的方法介绍

findall:找到符合条件的所有结果

# findall:返回所有满足匹配条件的结果,放在列表里
print(re.findall('e','alex make love'))
# ['e', 'e', 'e']

# search:只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
print(re.search('e','alex make love'))
# <re.Match object; span=(2, 3), match='e'>
print(re.search('e','alex make love').group())
# e

print(re.search("\d+\.?\d*","1.3 aa3.44aaa").group())
# 1.3
print(re.search("\d+\.?\d*","asdfsadf"))
# None


print(re.search("\d+\.?\d*"," 1.3 aa3.44aaa"))
# <re.Match object; span=(1, 4), match='1.3'>

# match:同search,不过在字符串开始处进行匹配,完全可以用search+^代替match
print(re.match("\d+\.?\d*"," 1.3 aa3.44aaa"))
# None

# split:可以按照任意符号分隔
msg="egon:18-male=10"

print(msg.split(':'))  # ['egon', '18-male=10']

print(re.split('[:=-]',msg))

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))
# ['href="https://pan.baidu.com/s/1skWyTT7"', 'href="https://www.baidu/com"']

search和match的相同点和不同点:

相同点:匹配到一个元素时就停止匹配,匹配不到时返回None

不同点:
	search是从任意位置进行匹配
	match是从字符串的开头进行匹配

compile:定义匹配规则

s='asdgfjfk123456'
obj=re.compile('\d+')
print(obj.findall(s))  # ['123456']

sub:字符串替换(类似于replace)

#re.sub:字符串替换
import re
content='Extra strings Hello 123 456 World_This is a Regex Demo Extra strings'

# content=re.sub('\d+','',content)
# print(content)

group():分组查看

group(0)代表查看所有
group(1)代表查看分组匹配的内容

finditer: 返回一个迭代器(数量大时使用)

小tips:

使用.*返回所有时,返回的是2个值,最后空的那个值代表取完了

name='akdsfsh123289060-65-=67=\nlsdjoir'
print(re.findall('.*',name,re.DOTALL))
# ['akdsfsh123289060-65-=67=\nlsdjoir', '']

二.面向对象编程

面向过程编程

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

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

面向对象编程

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

优点:可扩展性强
缺点:编程的复杂度高
# 面向对象式编程(针对以往所学知识)
# def choose_course():
#     print("====>")
#
# {"name":"egn","age":18,"choose":choose_course}

猜你喜欢

转载自blog.csdn.net/yikenaoguazi/article/details/107763051
今日推荐