0%

python进阶学习四(面向对象)

一、正则表达式

定义:正则表达式是一个特殊的字符串序列,一个字符串是否与我们所设定的这样的字符序列,相匹配。
正则表达式的作用:它的作用:快速检查文本,实现一些替换文本的操作。比如:

  • 1,检查一串数字是否是电话号码形式
  • 2,检测一个字符串是否符合email的格式
  • 3,把一个文本里指定的单词替换为另外一个单词 查找是否包含某个字符串
    比如有字符串: a = ‘C|C++|Java|C#|Python|JavaScript’。看以下示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import re
a = 'C|C++|Java|C#|Python|Jav|Python|aScript'

#内置函数
#是否包含'Python'
# print(a.index('Python') > -1)
#是否包含'Python'
# print('Python' in a)

#返回一个列表
r = re.findall('Python',a)
if len(r) != 0:
print('字符串包含Python')
else:
print('字符串包含PHP')
r = re.findall('Python',a)

# if len(r) != 0:
# print('字符串包含PHP')

正则表达式的灵魂是规则,上面的代码是一个常量,不能说不是规则,不过这并不是正则表达示的广泛应用。

找出字符串中所有的数字
字符串:a = ‘C|C++7|Java8|C#8|Python8|Jav|Python|aScript’

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
'Python':是普通字符
'\d':是元字符
#正则表达式就是元字符和普通字符的组合
#元字符
[百度百科正则表达式](https://baike.baidu.com/item/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1700215?fr=aladdin)

import re
a = 'C|C++7|Java8|C#8|Python8|Jav|Python|aScript'
#规则
#打印出所有的数字
r = re.findall('\d',a)
print(r)
#匹配一个非数字字符。等价于[^0-9]。grep要加上-P,perl正则支持
r = re.findall('\D',a)
print(r)

#打印结果
PS G:\python> python test14.py
['0', '7', '8', '9', '3']

1,字符集操作
a = ‘abc,acc,adc,aec,afc,ahc’,找到’a[cf]c’,就是找到字符串中间是c或f,两边分别是a和c。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#字符集
import re
a = 'abc,acc,adc,aec,afc,ahc'

#字符集的特性:[]中间的字符是 或 关系
r = re.findall('a[cf]c',a)
print(r)
#打印
PS G:\python\正则表达式> python test15.py
['acc', 'afc']


import re
a = 'abc,acc,adc,aec,afc,ahc'

#匹配不是c、f、d的字符
r = re.findall('a[^cfd]c',a)
print(r)
#打印结果
PS G:\python\正则表达式> python test15.py
['abc', 'aec', 'ahc']

import re
a = 'abc,acc,adc,aec,afc,ahc'

#匹配是c到f的字符
r = re.findall('a[c-f]c',a)
print(r)
#打印结果
PS G:\python\正则表达式> python test15.py
['acc', 'adc', 'aec', 'afc']

2,概括字符集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#找出全部数字
# '\d'就是一个概括字符集
import re
a = 'a111456pythonjava678php'

#以下两种方式都可以,正则表达式很灵活
r = re.findall('\d',a)
r = re.findall('[0-9]',a)
#非数字
r = re.findall('[^0-9]',a)

#数字和字母全匹配
r = re.findall('\w',a)# & 符号就不可以匹配

a = 'a 1\n4\r5\tp2g&__
r = re.findall('\W',a) #大写的W
print(r)
#打印
PS G:\python\正则表达式> python test16.py
[' ', '\n', '\r', '\t', '&']

#

import re
a = 'a145 p2\rg&__'
print(r)
#打印结果
PS G:\python\正则表达式> python test16.py
[' ', '\r']

小总结:

1
2
3
4
#概括字符集
# \d \D
# \w单词字符 \W
# \s空白字符 \

3,数量词

1
2
3
4
5
6
7
8
9
#
import re
a = 'python 145java678php'
r = re.findall('[a-z]{3,6}',a) #3到6个都可以

print(r)
#打印 结果
PS G:\python\正则表达式> python test17.py
['python', 'java', 'php']

为什么匹配到3个不会输出,而是会继续匹配?这涉及数量词的一个重要概念。
贪婪模式和非贪婪模式
数量词的贪婪和非贪婪方式:python的数量词默认是贪婪方式,所以匹配到3个的时候,会继续匹配,到第六个都匹配,后面不配,就才结束。所以会匹配出:python、java、php。

非贪婪模式:在规则后面加’?’:’[a-z]{3,6}?’
以上规则打印结果:[‘pyt’, ‘hon’, ‘jav’, ‘php’]

  • :打印0次或无限多次
  • :匹配1次或无限多次
    ? :匹配0次或1次
1
2
3
4
5
6
7
8
9
#以下三种情况第一行是代码,第二行是对应代码的输出结果。
r = re.findall('python*',a)
['pytho', 'python', 'pythonn']

r = re.findall('python+',a)
['python', 'pythonn']

r = re.findall('python?',a)
['pytho', 'python', 'python']
1
2
3
4
5
6
7
8
9
10

import re
language = 'Pythonc#JavaPHP'
#(python) 加了括号就是一个组,(python){3}这个组出现3次
#re.I 忽略大小写
r = re.findall('C#',language,re.I)
print(r)
#打印结果
PS G:\python\正则表达式> python test17.py
['c#']
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import re
language = 'PythonC#\nJavaPHP'
#(python) 加了括号就是一个组,(python){3}这个组出现3次
#re.I 忽略大小写
r = re.findall('c#.{1}',language,re.I)
print(r)
#打印
PS G:\python\正则表达式> python test17.py
[]
#加入re.S规则,就能匹配\n
import re
language = 'PythonC#\nJavaPHP'
#(python) 加了括号就是一个组,(python){3}这个组出现3次
#re.I 忽略大小写
r = re.findall('c#.{1}',language,re.I | re.S)
print(r)

PS G:\python\正则表达式> python test17.py
['C#\n']

贪婪模式和非贪婪模式

1
2
3
4
5
6
7
8
9
10
11
12

#非贪婪和贪婪模式
language = 'pythocpython#JavaPHPpythonn'
#['pytho', 'python', 'python']python']
r = re.findall('python?',language)
print(r)
#['python', 'python']
s = re.findall('python{1,2}?',language)
print(s)
#['python', 'pythonn']
t = re.findall('python{1,2}',language)
print(t)

边界匹配
qq号是否匹配(4到8位)?

1
2