python基础知识--8正则表达式
1.正则表达式
# 正则表达式
# 通俗而言,就是通过某种规则,来匹配符合条件的字符序列。
# 适用场景:
# 快速地查找、替换或匹配具有特殊格式的字符;
# 如:
# 文本替换;
# 匹配电子邮箱、电话号码、IP地址等;
# 匹配爬虫程序中,某些特殊格式的字符。
import re
re.findall(pattern, string, flags=0) # 会将所有符合条件的字符,放在一个列表中
# pattern 指的是,正则表达式匹配规则
# string 指的是,要进行匹配的字符串
# flags 指的是,可选参数,进行特定条件的匹配
# 需求:
# 匹配字符串中的所有 lemon
match_str = 'lemon&apple&lemoon&banana&lemooon&pear&lemoooon'
re.findall('lemon',match_str) # lemon 普通字符
运行:
['lemon']
#%%
# 需求
# 1.除了匹配 lemon,还想把 lemoon lemooon lemoooooon 给匹配出来
re.findall('lemo{1,4}n',match_str)
运行结果:
['lemon', 'lemoon', 'lemooon', 'lemoooon']
2.字符集
# 被匹配的字符集合
import re
match_str = 'bac | bbc | bcc | bdc | bec'
# 需求:
# 1.匹配 bac 或 bbc
re.findall('b[ab]c',match_str)
运行结果:
['bac', 'bbc']
re.findall('b[^ab]c',match_str) # ^ 取反
运行结果:
['bcc', 'bdc', 'bec']
# 需求
# 1.匹配 bac 或 bbc 或 bcc 或 bdc
re.findall('b[abcd]c',match_str) # [abcd]
运行结果:
['bac', 'bbc', 'bcc', 'bdc']
#%%
re.findall('b[a-d]c',match_str) # [a-d]
运行结果:
['bac', 'bbc', 'bcc', 'bdc']
#%%
re.findall('b[^a-d]c',match_str) # [^a-d] [^abcd]
运行结果:
['bec']
#%%
3.常见元字符
import re
# 数字字符
# \d 匹配一个数字字符
# \D 匹配一个非数字字符
match_str = '&a0b12c344d55&AC_'
re.findall('\d',match_str)
运行结果:
['0', '1', '2', '3', '4', '4', '5', '5']
re.findall('\D',match_str)
运行结果:
['&', 'a', 'b', 'c', 'd', '&', 'A', 'C', '_']
# 单词字符
# \w 匹配一个包括下划线的单词字符 A-Za-z0-9_
# \W 匹配一个非包括下划线的单词字符
#%%
match_str = '&a0b12c344d55&AC_'
re.findall('\w',match_str)
运行结果:
['a', '0', 'b', '1', '2', 'c', '3', '4', '4', 'd', '5', '5', 'A', 'C', '_']
re.findall('\W',match_str)
运行结果:
['&', '&']
# 空白字符
# \s 匹配一个空白字符 如空格、制表符、换页符等
# \S 匹配一个非空白字符
#%%
match_str = '\r\t&a0b12c344d55&AC_ \n'
re.findall('\s',match_str)
运行结果:
['\r', '\t', ' ', '\n']
re.findall('\S',match_str)
运行结果:
['&','a','0','b','1','2','c','3','4','4','d','5','5','&','A','C','_']
4.数量词
import re
match_str = '&a0b12c344d55&AC_6789'
# 需求:
# 1.想取出完整的数字集合 如 0、12、344、55
re.findall('\d{1,}',match_str)
运行结果:
['0', '12', '344', '55', '6789']
# {1,3} 代表匹配前面的字符,1次到3次
# {1,} 代表匹配前面的字符,1次到N次
#%%
match_str2 = 'lemon12banana34pear56'
# 需求:
# 1.想取出完整的单词集合 如 lemon、 banana、 pear
# \w A-Za-z0-9_
#%%
re.findall('[a-z]{4,6}',match_str2)
运行结果:
['lemon', 'banana', 'pear']
5.贪婪与非贪婪
import re
match_str = 'lemon12banana34pear56'
re.findall('[a-z]{4,6}?',match_str)
运行结果:
['lemo', 'bana', 'pear']
re.findall('[a-z]{4,6}',match_str)
运行结果:
['lemon', 'banana', 'pear']
#%%
# 数量词
# 贪婪 倾向于最大长度匹配
# 非贪婪 倾向于最小长度匹配
#%%
match_str = 'lemooooo'
re.findall('lemo{1,}',match_str)
运行结果:
['lemooooo']
re.findall('lemo{1,}?',match_str)
运行结果:
['lemo']
# 贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配;
# 非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。
6.次数匹配
re.findall('\d{1,3}',match_str) # 代表匹配前面的数字字符,1次到3次
re.findall('\d{1,}' ,match_str) # 代表匹配前面的数字字符,1次到N次
import re
# * 代表匹配前面的字符零次或多次 {0,}
# + 代表匹配前面的字符一次或多次 {1,}
# ? 代表匹配前面的字符零次或一次 {0,1}
#%%
match_str = 'lemo123 lemon345 lemonnnn567'
re.findall('lemon*',match_str)
运行结果:
['lemo', 'lemon', 'lemonnnn']
re.findall('lemon+',match_str)
运行结果:
['lemon', 'lemonnnn']
re.findall('lemon?',match_str)
运行结果:
['lemo', 'lemon', 'lemon']
# 对于 ? 总结
# 1.如果数量词后面有 ?,该 ? 代表非贪婪的关键字,倾向于取最小长度匹配
# 2.如果字符 后面有 ?,该 ? 代表匹配前面字符 0次或1次
7.定位符
import re
match_str = 'abcdef 123456 abcdef 456 abc'
# 需求1:
# 匹配所有的单词字符集合 如 abcdef abcdef abc
re.findall('[a-z]{3,6}',match_str)
运行结果:
['abcdef', 'abcdef', 'abc']
# 需求2:
# 1.匹配第一个的单词字符集合 如 abcdef
# 2.匹配最后一个的单词字符集合 如 abc
# 定位符用来匹配字符串的边界
^ 匹配字符串开始的位置
match_str = 'abcdef 123456 abcdef 456 abc'
re.findall('^[a-z]{6}',match_str)
运行结果:
['abcdef']
[^abc]
$ 匹配字符串结尾的位置
match_str = 'abcdef 123456 abcdef 456 abc'
re.findall('[a-z]{3}$',match_str)
运行结果:
['abc']
8.组的匹配
import re
match_str = 'lemonlemonlemonappleapplepearpear'
re.findall('(lemon){3}',match_str)
运行结果:
['lemon']
# 一组字符的集合
re.search('(lemon){3}',match_str).group()
运行结果:
'lemonlemonlemon'
组 与 字符集 区别
(lemon) 匹配 lemon 这一组字符
[lemon] 匹配 括号中的任意一个字母
re.findall('(lemon){3}',match_str)
运行结果:
['lemon']
re.findall('[lemon]',match_str)
运行结果:
['l','e','m','o','n','l','e','m','o','n','l','e','m','o','n','l','e','l','e','e' 'e']
9.FLAGS可选参数
import re
re.findall(pattern, string, flags=0)
# pattern 指的是,正则表达式匹配规则
# string 指的是,要进行匹配的字符串
# flags 指的是,可选参数,进行特定条件的匹配
match_str = 'lemon\n LEMON\n'
re.findall('lemon.',match_str,re.I | re.S)
运行结果:
['lemon\n', 'LEMON\n']
# 补充元字符
.
匹配除“\n”之外的任何单个字符
match_str = '\n123 abc\r'
re.findall('.',match_str,re.S)
运行结果:
['\n', '1', '2', '3', ' ', 'a', 'b', 'c', '\r']
10.MATCH函数与SERARCH函数
'''
re.findall(pattern, string, flags=0)
re.match(pattern, string, flags=0)
re.search(pattern, string, flags=0)
'''
#%%
'''
re.findall 搜索整个字符串,返回所有匹配项
re.match 从字符串首字符开始匹配,若首字符不匹配,则返回None,若匹配则返回第一个匹配对象。
re.search 搜索整个字符串, 若全都不匹配,则返回None,若匹配则返回第一个匹配对象。
'''
import re
match_str = 'a5678 lemon 1234'
re.findall('\d',match_str)
运行结果:
['5', '6', '7', '8', '1', '2', '3', '4']
re.match('\d',match_str)
运行结果:
<_sre.SRE_Match object; span=(0, 1), match='5'>
re.search('\d',match_str)
运行结果:
<_sre.SRE_Match object; span=(1, 2), match='5'>
11.Group组匹配
# group(0) 记录的是完整匹配的结果
# 用 () 来表示其中的内容属于一个分组
import re
match_str = 'life is mostly happy,but sometimes sad'
# 需求:
# 1.将 is mostly happy,but sometimes 匹配出来
# 2.将 is mostly happy 以及 sometimes 分别匹配出来
#%%
r = re.search('life(.*)sad',match_str)
r
运行结果:
<_sre.SRE_Match object; span=(0, 38), match='life is mostly happy,but sometimes sad'>
r.group(0)
运行结果:
'life is mostly happy,but sometimes sad'
r.group(1)
运行结果:
' is mostly happy,but sometimes '
#%%
r1 = re.search('life(.*)but(.*)sad',match_str)
r1
r1.group(1)
运行结果:
' is mostly happy,'
r1.group(2)
运行结果:
' sometimes '
r1.groups()
运行结果:
(' is mostly happy,', ' sometimes ')
12.正则替换
# re.sub(pattern, repl, string, count=0, flags=0)
# pattern 正则表达式
# repl 要替换的内容,也可传入函数
# string 被替换的字符串
# count 默认为0,代表全部替换 。
# 1 代表替换1次,
# 2 代表替换2次,以此类推
#%%
import re
match_str = 'lemon apple 123456789 lemon lemon'
# 需求
# 将lemon 全都转为 a
re.sub('lemon','a',match_str,count=2)
运行结果:
'a apple 123456789 a lemon'
# 需求 xx
# 数字 小于 7的,都转为 0 , 数字 大于等于 7的,都转为 10
#%%
match_str = 'lemon apple 123456789 lemon lemon'
def transform(value):
match_num = value.group()
print(match_num)
if int(match_num) < 7:
return '0'
return '10'
re.sub('\d',transform,match_str,count=0)
运行结果:
1 2 3 4 5 6 7 8 9
'lemon apple 000000101010 lemon lemon'
posted on 2020-10-23 11:58 kunlungege 阅读(133) 评论(0) 编辑 收藏 举报