该文主要为概念详解(理解)。实例参见文末链接,博主示例写的很详细。
- python re 模块的使用
- python 正则表达式字符
""" 1、python re 模块的使用 """
# (1)、re.match()
# res = re.match(pattern, string, flags=0)尝试从字符串的起始位置匹配一个字符串,匹配以pattern开头的字符串
# 成功返回match的"对象",否则返回None。调用:结果对象res.group()输出返回的结果,匹配失败不能用group
# .group(num) 多个结果以元组的形式存储 num的取值为1 2 3,用下标的形式获取匹配的结果,也可以group()输出
# .groups() 以元组的形式,返回多个匹配的结果
# (2)、re.complie()
# complie将正则表达式模式编译成一个正则表达式对象
# reg = re.compile() result = reg.match(string) 共两行代码,对象重用效率高
# 上述两行等价于result = re.match(pattern, string)
# (3)、re.search()
# re.search(pattern, string, flags=0) 在全文中匹配一次,匹配到(找到了)就返回"对象"
data = '我爱我的祖国,我来自中国,中国的风景非常美丽' # 这里有两个“中国”
res = re.search('中国', data)
print(res) # 返回索引为(10,12)
print(data[10:12]) # 查看一下,确实是返回的第一个“中国”
# print(res.group())
# (4)、re.findall() 返回的是一个列表
# 用于查询字符串中/某个正则表达式匹配到的/所有满足条件的结果,返回的是一个"列表",该方法使用频率高
# re.findall(string, pos, endpos) 三个参数
# string为待匹配的字符串;pos可选参数,指定字符串的起始位置,默认为0;
# endpos可选参数,指定字符串的结束位置,默认为字符串的长度
data = '华为是华人、华侨的骄傲!'
res1 = re.findall('华.', data)
print(res1)
res = re.compile('华.') # 最好用这个方法
res2 = res.findall(data)
print(res2)
# (5)、re.sub()
# 将匹配到的数据进行替换 re.sub(pattern, repl, string, count=0, flags=0)
# 上述5个参数的含义依次为:正则中的模式字符串;替换的字符串;要被查找替换的原始字符串
# 替换的次数,默认为0表示替换所有的匹配;标志位,控制匹配方式。
# 下面是一个例子
data = '我在学习Python, Python是一门很受欢迎的编程语言,我熟悉用Python'
res1 = re.sub('[A-Za-z]+', 'C++', data) # 全部替换
res2 = re.sub('[A-Za-z]+', 'C++', data, count=2) # 替换两处
print(res1)
print(res2)
# (6)、re.subn()
# 用于完成目标的搜索和替换,以"元组"形式返回被替换的数量
data = '我在学习Python, Python是一门很受欢迎的编程语言,我熟悉用Python'
resn = re.subn('[A-Za-z]+', 'C++', data) # 全部替换
print(resn)
# (7)、re.split()
# 实现字符串的分割,返回一个"列表"
data = 'C++,C#,Java,Python,Perl'
print(re.split(',', data)) # 用逗号分割,结果为一个list
""" 2、python正则表达式字符 """
# \A 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
# \Z 匹配字符结尾,同$
# \d 匹配数字0-9
# \D 匹配非数字
# \w 匹配[A-Za-z0-9]
# \W 匹配非[A-Za-z0-9]
# \s 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
# \b 单词边界
# \B 非单词边界
# ^ 放在中括号里面指的是取反,放在中括号外面指的是“开头”,只匹配开头的一个数据
# $ 结尾
# . 匹配任何单个字符(除了换行符),它只能出现在方括号以外,如果匹配6个字母,那么写6个点
# ? 可选字符。u?表示u既可以出现也可以不出现,匹配?之前的字符0次或1次 favou?rite
# {N} 在一个字符组后加上{N} 就可以表示在它之前的字符组出现N次 \d{3}-\d{5} 匹配电话号码 010-88480
# {M,N} M是下界N是上界,\d{3,4}既可以匹配3个数字也可以匹配4个数字,当有4个数字的时候,
# 优先匹配4个数字,这是因为正则表达式默认是贪婪模式,非贪婪模式,需要在后面加一个?,\d{3,4}?
# + * 开闭区间:遇到字符组的重复次数没有边界时,如 \d{1,}:第二个区间不写,表示匹配1个或无穷个,是贪婪模式
# 使用 + 匹配前面的模式1个到无数个,使用 * 代表0个到无数个,即:+等价于{1,},*等价于{0,},是贪婪模式
# .+ 匹配任意字符1个或者无穷个 .* 匹配任意字符0个或者无穷个
# () 分组机制:使用分组时,除了获得整个匹配,还能够在匹配中选择每一个分组。
# | 或者,在()中使用
# (?:表达式) 非捕获分组?:,并不需要捕获某个分组的内容,但是又想使用分组的特性,也就是不想要某一个分组的结果
# 分组的回溯引用 引用之前匹配分组的机制,使用\N可以引用编号为N的分组,如\1
# 正向先行断言 (?=表达式),指在某个位置向右看,表示所在位置右侧必须能匹配表达式,但是不匹配括号内的内容,匹配
# 的是括号之前的
# 反向先行断言 (?!表达式) 保证右边不能出现某字符表达式
# 正向后行断言 先行断言和后行断言区别在于:先行断言从左往右看,后行断言从右往左看;
# (?<=表达式),指在某个位置向左看,表示所在位置左侧必须能匹配表达式
# eg. 如果要取出“爱”这个字,要求爱的前面有“我”,后面有“中国”,这时:(?<=我)爱(?=中国)
# 反向后行断言 (?<!表达式),指在某个位置向左看,表示所在位置左侧不能匹配表达式
# 例如:如果要取出“爱”这个字,要求爱的前面没有“我”,后面没有“你”,(?<!我)爱(?!你)
# (?P<>) P是大写的,用于分组起别名 <>里面为别名,使用时:(?P=引用的名字)
Python正则表达式符号及re模块例子(详细使用情况):