re模块简介
-
Python1.5版本提供了re模块,该模块提供所有的正则表达式功能
-
使用re模块,首先导入re模块:
import re
正则表达式模式(pattern)
模式 | 描述 | 例子 | 是否重点 |
---|---|---|---|
^ |
匹配字符串的开头。 | √ | |
$ |
匹配字符串的末尾。 | √ | |
. |
匹配任意字符,除了换行符\n ,当re.DOTALL 标记被指定时,则可以匹配包括换行符的任意字符。 |
||
[...] |
用来表示一组字符,表示范围。 | 例如:单独列出:[amk] 匹配 'a' ,'m' 或者 'k' , |
|
[^...] |
匹配不在 [] 中的字符。 |
例如: [^abc] 匹配除了a,b,c之外的字符 |
|
re* |
匹配0个或者多个的表达式。 | √ | |
re+ |
匹配1个或者多个的表达式。 | √ | |
re? |
匹配0个或者1个由前面的正则表达式定义的片段,非贪婪方式。 | √ | |
re{n} |
精确匹配n个前面表达式。 | 例如: o{2} 不能匹配“Bob”中的“o”,但是能匹配“food”中的两个“o”。 |
√ |
re{n,} |
匹配 至少n个 前面表达式。 | 例如: o{2,} 不能匹配“Bob”中的“o”,但是能匹配“fooooood”中的所有“o”。o{1,} == o+ 。 o{0,} == o* |
√ |
re{n,m} |
匹配 n-m次 由前面的正则表达式定义的片段,贪婪方式。 | 例如:o{2,3} 不能匹配“Bob”中的“o”,但是能匹配“food”|“foood”中的“o”。 |
√ |
a|b |
匹配 a或者b | 例如: P|python 匹配Python和python |
√ |
(re) |
对正则表达式 分组 并且记住匹配的文本 | √ | |
(?imx) |
正则表达式包含三种可选标志:i,m,x 。只影响括号中的区域。 |
||
(?-imx) |
正则表达式关闭 i,m,x 可选标志。只影响括号中的区域。 |
||
(?: re) |
类似 (...) ,但是不表示一个组。 |
||
(?imx: re) |
在括号中使用 i,m,x 可选标志。 |
||
(?-imx: re) |
在括号中不使用 i,m,x 可选标志。 |
||
(?#...) |
注释。 | ||
(?= re) |
前向肯定定位符。 | ||
(?| re) |
前向否定定位符。 | ||
(?> re) |
匹配的独立模式,省去回溯。 | ||
\w |
匹配字母数字下划线。 | ||
\W |
匹配非字母数字下划线 | ||
\s |
匹配 任意空白字符 ,等价于 [\t\n\r\f] 。 |
||
\S |
匹配 任意非空白字符 。 | ||
\d |
匹配任意 数字,等价于 [0-9] |
||
\D |
匹配任意 非数字 | ||
\A |
匹配字符串开始 | ||
\Z |
匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 | ||
\z |
匹配字符串结束 | ||
\G |
匹配最后匹配完成的位置 | ||
\b |
匹配 一个单词 边界,也就是指单词和空格间的位置。 | 例如:'er\b' 能匹配"never" 中的er ,但不能匹配"verb" 中的er |
|
\B |
匹配 非单词 边界。 | 例如:'er\B' 能匹配"verb" 中的er ,但不能匹配"never" 中的er |
|
\n,\t,等 |
匹配一个换行符。匹配一个制表符。等 | ||
\1...\9 |
匹配第n个分组的内容。 | ||
\10 |
匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。 |
-
[Pp]ython
:匹配"Python|python"
。类似于P|python
-
rub[ye]
:匹配"ruby|rube"
。类似于ruby|e
-
[0-9]
:匹配任何数字。类似于[0123456789]
-
[a-z]
:匹配任何小写字母。 -
[A-Z]
:匹配任何大写字母 -
[a-zA-Z0-9]
:匹配任何字母和数字。类似于 -
[^0-9]
:匹配除了数字外的字符
正则表达式函数
函数各参数
-
pattern
:匹配的正则表达式。 -
string
:要匹配的字符串。 -
flags
:标志位,可用于控制正则表达式的匹配方式,如是否区分大小写,多行匹配等。-
re.I
:使匹配对大小写不敏感 -
re.L
:做本地化识别匹配 -
re.M
:多行匹配,影响^和$
-
re.S
:使.
匹配包括换行以内的所有字符 -
re.U
:根据Unicode字符集解析字符。这个标志影响\W,\w,\b,\B
。 -
re.X
:该标志通过给予你更灵活的格式以便你将正则表达式写得更容易理解。
-
re.match
-
re.match(pattern,string,flags=0)
import re
# 在起始位置匹配
print(re.match('www',"www.xw.com").span())
# 不在起始位置匹配
print(re.match('com','www.xw.com'))
"""---------------------------------------"""
line = "Cat are smarter than dogs"
"""
re.match(pattern,string,flags)
'''
.:匹配一个任意字符
re*:匹配 >=0个 的表达式。.*:匹配任意个任意字符
re?:匹配 0|1个 由前面的正则表达式定义的片段。
'''
"""
# .*:匹配任意个任意字符。
# .*?:
matchObj = re.match(r'(.*) are (.*?) .*',line,re.I|re.M)
if matchObj:
print("matchObj.group():",matchObj.group())
print("matchObj.group(1):",matchObj.group(1))
print("matchObj.group(2):",matchObj.group(2))
print("matchObj.groups():",matchObj.groups())
re.search
-
re.search(pattern,string,flags=0)
import re
# 在起始位置匹配
print(re.search('www',"www.xw.com").span())
# 不在起始位置匹配
print(re.search('com','www.xw.com').span())
"""---------------------------------------"""
line = "Cat are smarter than dogs"
"""
re.search(pattern,string,flags)
'''
.:匹配一个任意字符
re*:匹配 >=0个 的表达式。.*:匹配任意个任意字符
re?:匹配 0|1个 由前面的正则表达式定义的片段。
'''
"""
# (.*):匹配任意个任意字符,并且分组。
# (.*?):匹配任意个任意字符,
searchObj = re.search(r'(.*) are (.*?) .*',line,re.I|re.M)
if searchObj:
print("searchObj.group():",searchObj.group())
print("searchObj.group(1):",searchObj.group(1))
print("searchObj.group(2):",searchObj.group(2))
print("searchObj.groups():",searchObj.groups())
re.sub
-
re.sub(pattern,repl,string,count=0,flags=0)
-
用于替换字符串中的匹配项。
-
import re
"""
re.sub(pattern,repl,string,count=0,flags=0)
"""
# repl为普通参数:
phone = "133-8716-6270 #注释"
# 删除字符串中的 #注释
num = re.sub(r'#.*$'," ",phone)
print("电话号码:",num)
# 删除非数字 -
num = re.sub(r'\D','',phone)
print("电话号码:",num)
# repl为函数:
# 将匹配的数字 *2
def double(matched):
value = int(matched.group('value'))
return str(value *2)
s = 'AAAA##$$$$33456'
print(re.sub('(?P<value>\d+)',double,s))
re.compile
import re
# 用于匹配至少一个数字
pattern = re.compile(r'\d+')
# 查找头部,没有匹配
m = pattern.match('one12twossfaf34fag')
print(m)
# 从字符串索引为(3-14)的位置匹配,匹配成功
m = pattern.match('one12twossfaf34fag',3,14)
print(m)
print(m.group())
print(m.start())
print(m.end())
print(m.span())
-
group([group1],...)
-
start([group])
-
end([group])
-
span([group])
-
方法返回
(start(group) , end(group))
-
re.finditer
findall
-
findall(string[,pos[,endpos]])
-
在字符串中找到正则表达式所匹配的所有子串,并且返回一个列表,如果没有找到匹配的,则返回空列表。
-
match和search
是匹配一次findall
匹配所有。
-
-
参数:
re.finditer
-
re.finditer(pattern,string,flags=0)
-
和
findall
类似,在字符串中找到正则表达式所匹配的所有子串,并且它们作为一个迭代器返回。
-
import re
# findall:
pattern = re.compile(r'\d+') #查找数字
result1 = pattern.findall('rnoob 1414')
result2 = pattern.findall('rnoob1afsafasf21g5gr155161',5,77)
print(result1)
print(result2)
# re.finditer:
it = re.finditer(r'\d+',"121415fag516 afag")
for m in it:
print(m.group())
re.split
-
re.split(pattern,string[,maxsplit=0,flags=0])
-
re.split()
方法安照能够匹配的子串将字符串分割后返回列表。
-
-
参数:
import re
cut = '11fag51,53-52sg,,g3 y6shsgl'
print(re.split('\W+',cut))
print(re.split('\d+',cut))
正则表达式对象
re.RegexObject
-
re.compile()
返回RegexObject
对象
re.MatchObject
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。