笔记:
一:简介
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
主要介绍Python中常用的正则表达式处理函数
提高工作效率,完成内置函数无法完成的任务!
搜索常用正则表达式!----->提高工作效率!
有意识的多食用正则表达式!
作用是快速检索文本,实现一些替换文本的操作。
检测一串数字是不是电话号码,字符串是不是email,字符串的替换。
二:re.findall函数
在字符串中匹配正则表达式,返回形式为列表!
number1 = re.findall(r'\d+', string1)
(1)'python' 普通字符,
(2)'\d'元字符---->百度百科元字符
(3)字符集 a[bf]c
(4)概括字符集
# 数字[0-9] 非数字[^0-9] 字符'\D'
# \w == [0-9A-Za-z_] 匹配单词字符 \W 匹配非单词字符
# \D \d
# \s 空白字符 \S 非空白字符
(5)数量词 [a-z]{3,6}?
(6)边界匹配 '^\d{4,8}$
(7)匹配模式(flags)
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
二:re.sub函数(正则替换)
re.sub用于替换字符串中的匹配项
re.sub(pattern, repl, string, count=0)
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
三:re.match函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none
其他使用和findall函数完全相同
re.match(pattern, string, flags=0)
pattern:匹配的正则表达式
string:要匹配的字符串
flags:标志位
四:re.search函数
re.search 扫描整个字符串并返回第一个成功的匹配。
re.search(pattern, string, flags=0)
pattern:匹配的正则表达式
string:要匹配的字符串
flags:标志位
代码:
1 import re
2 a = 'C|Python|Java|C#|Python|Javascript|Python'
3 print(a.index('Python') > -1) # 判断字符是不是在字符串中
4 print('Python' in a)
5
6 # -----------------------------------------------#
7 # re.findall函数
8 # -----------------------------------------------#
9 # re.findall('正则表达式', a)--->使用关键为正则表达式为变量
10 # ---------------------常量--------------------#
11 r = re.findall('Python', a)
12 if len(r) > 0:
13 print("字符串中包含PHP")
14 else:
15 print("no")
16 print(r) # 输出结果用列表的形式存放
17
18 # ----------------------元字符-----------------#
19 string1 = 'C3Python4Java5C#6Python7Javascript8Python'
20 # for in
21 # 正则表达式
22
23 number1 = re.findall(r'\d+', string1)
24 # D表示非数字,d表示数字 + 表示连续查找!
25 print(number1)
26
27 # ---------------------字符集-----------------#
28 string2 = 'afc, acc, adc, aec, abc, ahc'
29 r = re.findall('a[bf]c', string2) # 找出中间为b或者f的
30 print(r)
31
32 r = re.findall('a[^bf]c', string2) # 找出中间不为b或者f的
33 print(r)
34
35 r = re.findall('a[c-f]c', string2) # 连续字符
36 print(r)
37
38 # ---------------------概括字符集-----------------#
39 # 数字[0-9] 非数字[^0-9] 字符'\D'
40 # \w == [0-9A-Za-z_] 匹配单词字符 \W 匹配非单词字符
41 # \D \d
42 # \s 空白字符 \S 非空白字符
43
44 string3 = 'afc, acc ahcdsfa sfa s f465 454 561_61'
45
46 r = re.findall('[0-9A-Za-z_]', string3) # 连续字符s
47 print(r)
48
49 # ---------------------数量词-----------------#
50
51 string4 = 'python 11111java678php'
52 r = re.findall('[a-z]{3,6}', string4) # 贪婪模式匹配
53 print(r)
54
55 # 贪婪和非贪婪 Python倾向贪婪
56
57 r = re.findall('[a-z]{3,6}?', string4) # 非贪婪模式匹配
58 print(r)
59
60 # 匹配 * 前面的一个字符出现零次或者无限多次
61 # 匹配 + 前面的一个字符出现1次或者无限多次
62 # 匹配 ? 前面的一个字符出现0次或者1次(字符串的截取)
63 # 匹配 . 匹配除了换行符\n之外的所有字符
64
65 string5 = 'pytho0python1pythonn2'
66 r = re.findall('python?', string5)
67 print('string5:', r)
68
69 # ---------------------边界匹配-----------------#
70 # ^表示从开始匹配 $ 表示从末尾匹配
71
72 qq = '107847'
73 r = re.findall('^\d{4,8}$', qq)
74 print(r)
75
76 # ----------------------组-------------------#
77
78 a = 'pythonpythonpythonpythonpythonpythonpython'
79 r = re.findall('(python){2}', a)
80 print(r)
81
82 # ---------------------匹配模式------------------#
83
84 a = 'pythonC#JavaPHP'
85 r = re.findall('c#', a, re.I)
86 print(r)
87
88
89 # -------------------------------------------------#
90 # re.sub函数
91 # -------------------------------------------------#
92
93 lanuage = 'PythonC#JavaPHP'
94 r = re.sub('C#', 'Go', lanuage, count=0)
95 # replace函数
96 print(r)
97
98 # 把函数当做参数传到sub函数中,对于不同的对象做不同的处理!
99
100
101 def convert(value):
102 print(value)
103 matched = value.group() # 获取匹配到的字符串
104 return '!!' + matched + '@@' # 对字符串修改
105
106
107 r = re.sub('C#', convert, lanuage, count=0)
108 # 把匹配到的字符串作为函数的实参传入函数中,并在函数中对匹配的字符串操作,
109 # 返回替换后的字符串
110 print(r)
111
112
113 # -------------------------------------------------#
114 # 函数作为参数的正则匹配例子
115 # -------------------------------------------------#
116 # 数字大于等于6的替换为9,小于等于6的替换为0
117
118 def convert1(value):
119 matched = value.group()
120 matched = int(matched) # 转换为数字
121 if matched > 6:
122 return '9' # 只能返回字符串
123 elif matched < 6:
124 return '0'
125 print(matched)
126
127
128 s = 'A8C3721D86'
129 r = re.sub('\d', convert1, s)
130 print(r)
131
132 # 软件设计思想: 一个函数用另一个函数作为参数
133 # 接受一个值,返回一个值,不关心中间的处理过程
134
135 # -------------------------------------------------#
136 # search函数和match函数
137 # -------------------------------------------------#
138 s = '18C3721D86'
139 r = re.match('\d', s)
140 r = r.span() # 拿出位置和值
141 print(r)
142
143 r = re.search('\d', s)
144 r = r.group()
145 print(r) # 拿出值
146
147 # -------------------------------------------------#
148 # group分组-----()
149 # -------------------------------------------------#
150 # (爬虫的应用:根据标签找到标签中间的内容,不包括标签本身)
151 s = 'life is short, i use python'
152 r = re.search('life(.*)python', s)
153 print(r.group(0)) # 获取分组后的匹配结果
154 print(r.group(1)) # 获取分组后的匹配结果
155
156 r = re.findall('life(.*)python', s)
157 print(r) # 获取分组后的匹配结果
158
159
160 s = 'life is short, i use python, i love python'
161 r = re.search('life(.*)python(.*)python', s)
162 print(r.group(0)) # 获取分组后的匹配结果
163 print(r.group(1)) # 获取分组后的匹配结果
164 print(r.group(2)) # 获取分组后的匹配结果
165
166 print(r.group(0, 1, 2)) # 获取分组后的匹配结果
167
168 print(r.groups()) # 匹配结果