美文网首页
Python-re模块(正则表达式)

Python-re模块(正则表达式)

作者: 莫忘初心_倒霉熊 | 来源:发表于2020-05-17 16:18 被阅读0次

01. 正则表达式基础知识

1.1 原子

原子是正则表达式中最基本的组成单位,每个正则表达式中至少要包含一个原子,常见的原子有以下几类:
1)普通字符作为原子
2)非打印字符作为原子
3)通用字符作为原子
4)原子表

1.1.1普通字符作为原子

我们可以使用一些普通的字符,比如数字,大小写字母,下划线等都可以作为原子使用。

import re
pattern ="baidu"
string ="http://www.baidu.com"
result1= re.search(pattern,string)
print(result1)

# 输出:
# <re.Match object; span=(11, 16), match='baidu'>

1.1.2非打印字符作为原子

所谓的非打印字符,指的是一些在字符串中用于格式控制的符号,比如换行符等。

符号 含义
\n 用于匹配一个换行符
\t 用于匹配一个制表符
import re
pattern ="\n"
string =""""http://www.baidu.com
baiduyixia
"""
result1= re.search(pattern,string)
print(result1)

# 输出:
# <re.Match object; span=(21, 22), match='\n'>

1.1.3通用字符作为原子

所谓通用字符,即一个原子可以匹配一类字符。

符号 含义
\w 匹配任意一个字母,数字或下划线
\W 匹配除字母,数字和下划线以外的任意一个字符
\d 匹配任意一个十进制数
\D 匹配除十进制数以外的任意一个其他字符
\s 匹配任意一个空白字符
\S 匹配除空白字符以外的任意一个其他字符
import re
pattern ="\w\dpython\w"
string ="abcdfphp345pythony_py"
result1= re.search(pattern,string)
print(result1)

# 输出:
# <re.Match object; span=(9, 18), match='45pythony'>

1.1.4原子表

使用原子表,可以定义一组地位平等的原子,然后匹配的时候会取该原子表中的任意一个原子进行匹配,在Python中,原子表由[]表示。
类似的,[^]代表的是除了中括号里面的原子均可以匹配。

import re
pattern1 ="\w\dpython[xyz]\w"
pattern2 ="\w\dpython[^xyz]\w"
pattern3 ="\w\dpython[xyz]\W"
string ="abcdfphp345pythony_py"
result1= re.search(pattern1,string)
result2= re.search(pattern2,string)
result3= re.search(pattern3,string)
print(result1)
print(result2)
print(result3)

# 输出:
# <re.Match object; span=(9, 19), match='45pythony_'>
# None
# None

1.2元字符

所谓元字符,就是正则表达式中具有一下特殊含义的字符

符号 含义
. 匹配除换行符以外的任意字符
^ 匹配字符串的开始位置
$ 匹配字符串的结束位置
* 匹配0次,1次或多次前面的原子
? 匹配0次或1次前面的原子
+ 匹配1次或多次前面的原子
{n} 前面的原子恰好出现n次
{n,} 前面的原子至少出现n次
{n,m} 前面的原子至少出现n次,至多出现m次
| 模式选择符
() 模式单元符

元字符可以分为:任意匹配元字符,边界限制元字符,限定符,模式选择符,模式单元等。

1.2.1任意匹配元字符

.匹配除换行符以外的任意字符

import re
pattern =".python..."
string ="abcdfphp345pythony_py"
result1= re.search(pattern,string)
print(result1)

# 输出:
# <re.Match object; span=(10, 20), match='5pythony_p'>

1.2.2边界限制元字符

^匹配字符串的开始位置 $匹配字符串的结束位置

import re
pattern1 ="^abd"
pattern2 ="^abc"
pattern3 ="py$"
pattern4 ="ay$"
string ="abcdfphp345pythony_py"
result1= re.search(pattern1,string)
result2= re.search(pattern2,string)
result3= re.search(pattern3,string)
result4= re.search(pattern4,string)
print(result1)
print(result2)
print(result3)
print(result4)

# 输出:
# None
# <re.Match object; span=(0, 3), match='abc'>
# <re.Match object; span=(19, 21), match='py'>
# None

1.2.3 限定符

常见的限定符包括*+{n}{n,}{n,m}

import re
pattern1 ="py.*n"
pattern2 ="cd{2}"
pattern3 ="cd{3}"
pattern4 ="cd{2,}"
string ="abcdddfphp345pythony_py"
result1= re.search(pattern1,string)
result2= re.search(pattern2,string)
result3= re.search(pattern3,string)
result4= re.search(pattern4,string)
print(result1)
print(result2)
print(result3)
print(result4)

# 输出:
# <re.Match object; span=(13, 19), match='python'>
# <re.Match object; span=(2, 5), match='cdd'>
# <re.Match object; span=(2, 6), match='cddd'>
# <re.Match object; span=(2, 6), match='cddd'>

1.2.4模式选择符

模式选择符|,可以设置多个模式,匹配时,可以从中选择任意一个模式匹配

import re
pattern1 ="python|php"
string ="abcdfphp345pythony_py"
result1= re.search(pattern1,string)
print(result1)

# 输出:
# <re.Match object; span=(5, 8), match='php'>

1.2.5模式单元

使用模式单元()将一些原子组合成一个大原子使用,小括号括起来的部分会被当做一个整体去使用。

import re
pattern1 ="(cd){1,}"
pattern2 ="cd{1,}"
string ="abcdcdcdcdfphp345pythony_py"
result1= re.search(pattern1,string)
result2= re.search(pattern2,string)
print(result1)
print(result2)

# 输出:
# <re.Match object; span=(2, 10), match='cdcdcdcd'>
# <re.Match object; span=(2, 4), match='cd'>

1.3模式修正

所谓模式修正符,即可以在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能。

符号 含义
I 匹配时忽略大小写
M 多行匹配
L 做本地化识别匹配
U 根据Unicode字符及解析字符
S .匹配包括换行符,即用了该模式修正后,.匹配就可以匹配任意的字符
import re
pattern1 ="python"
pattern2 ="python"
string ="abcdfphp345Pythony_py"
result1= re.search(pattern1,string)
result2= re.search(pattern2,string,re.I)
print(result1)
print(result2)

# 输出:
# None
# <re.Match object; span=(11, 17), match='Python'>

1.4 贪婪模式与懒惰模式

贪婪模式的核心点就是尽可能多低匹配
懒惰模式的核心点就是尽可能少低匹配
通常情况下,如果想在某些字符间匹配任意字符,像p.*y这样写没有任何的语法错误,这个时候默认是使用贪婪模式的,如果要转化为懒惰模式, 需要在对应的.*后面加上?,方可转化为懒惰模式。

import re
pattern1 ="p.*y" # 贪婪模式
pattern2 ="p.*?y" # 懒惰模式
string ="abcdfphp345Pythony_py"
result1= re.search(pattern1,string)
result2= re.search(pattern2,string,re.I)
print(result1)
print(result2)

# 输出:
# <re.Match object; span=(5, 21), match='php345Pythony_py'>
# <re.Match object; span=(5, 13), match='php345Py'>

02 正则表达式常见函数

常见的正则表达式函数有re.match(),re.search(),全局匹配函数,re.sub()。

2.1 re.match()函数

如果想要从源字符串的起始位置匹配一个模式,可以使用 re.match()函数。
re.match(pattern,string,flag)
第一个参数代表对应的正则表达式;
第二个参数代表对应的源字符;
第三个参数是可选参数,代表对应的标志位,可以放模式修正符等信息。

import re
pattern =".python."
string ="apythonhellomypythonhispythonourpythonend"
result= re.match(pattern,string)
result2= re.match(pattern,string).span()
print(result)
print(result2)

# 输出:
# <re.Match object; span=(0, 8), match='apythonh'>
# (0, 8)

2.2 re.search()函数

使用re.search()函数进行匹配,会扫描整个字符串并进行对应的匹配。

import re
pattern =".python."
string ="hellomypythonhispythonourpythonend"
result= re.match(pattern,string)
result2= re.search(pattern,string)
print(result)
print(result2)

# 输出:
# None
# <re.Match object; span=(6, 14), match='ypythonh'>

2.3 全局匹配函数

全局匹配函数会将符合模式的内容全部都匹配出来。
1)使用re.compile()对正则表达式进行预编译;
2)编译后,使用findall()根据正则表达式从源字符串中将匹配的结果全部找出。

import re
string ="hellomypythonhispythonourpythonend"
pattern = re.compile(".python.")    # 预编译
result= pattern.findall(string)    # 找出符合模式的所有结果

print(result)

# 输出:
# ['ypythonh', 'spythono', 'rpythone']

2.4 re.sub()函数

re.sub()函数可以根据正则表达式来实现替换某些字符串的功能。
re.sub(pattern, rep,string,max)
第一个参数为对应的正则表达式;
第二个参数为要替换成的字符串;
第三个参数为源字符串;
第四个参数为可选项,代表最多替换的次数,默认全部替换。

import re
string ="hellomypythonhispythonourpythonend"
pattern ="python."
result1 = re.sub(pattern,"php",string)   # 全部替换
result2 = re.sub(pattern,"php",string,2)      # 最多替换俩次
print(result1)
print(result2)

# 输出:
# hellomyphpisphpurphpnd
# hellomyphpisphpurpythonend

相关文章

网友评论

      本文标题:Python-re模块(正则表达式)

      本文链接:https://www.haomeiwen.com/subject/soqsohtx.html