是时候
关注
我们一波了
模块正则表达式(RE)指定与其匹配的一组字符串(模式)。 为了理解RE的类比,MetaCharacter是有用的,重要的,并且将在模块re的功能中使用。 一共有14个元字符,将在功能中进行讨论:
\用来掉落字符的特殊含义
跟随它(在下面讨论)
[]代表角色类别
^匹配开头
$匹配结尾
。匹配换行符以外的任何字符
?匹配零个或一个匹配项。
| 表示OR(与任何字符匹配
被它分开。
*任意次数(包括0次)
+一次或多次
{}指示先前RE的出现次数
匹配。
()附上一组RE
函数compile()将 正则表达式编译成模式对象,该对象具有用于各种操作的方法,例如搜索模式匹配或执行字符串替换。
import re
#compile()创建正则表达式字符类[a-e],
#相当于[abcde]。
#类[abcde]将与具有“a”、“b”、“c”、“d”、“e”的字符串匹配。
p = re.compile('[a-e]')
# findall()搜索正则表达式,找到后返回一个列表
print(p.findall("找到了"))
输出:
['e','a','d','b','e','a']
了解输出: 第一次出现是“ Aye”中的“ e”,而不是“ A”,因为它区分大小写。 下一个出现是“ said”中的“ a”,然后是“ said”中的“ d”,然后是“ Gibenson”中的“ b”和“ e”,最后一个“ a”与“ Stark”匹配。
元字符反斜杠“ \”具有非常重要的作用,因为它可以发出各种序列的信号。如果要使用反斜杠而不使用其特殊含义作为元字符,请使用'\\'
\d匹配任何十进制数字,这等效
到设置的类别[0-9]。
\D匹配任何非数字字符。
\s匹配任何空格字符。
\S匹配任何非空白字符
\w匹配任何字母数字字符,这是
等效于类[a-zA-Z0-9_]。
\W匹配任何非字母数字字符。
设置类[\ s ,.]将匹配任何空格字符“,”或“”..
import re
# \d相当于[0-9]。
p = re.compile('\d')
print(p.findall("我在2020年7月9日上午11时去关注软件测试公众号"))
# \d+ 将匹配[0-9]上的组,组大小为一个或更大
p = re.compile('\d+')
print(p.findall("我在2020年7月9日上午11时去关注软件测试公众号"))
输出:
['2', '0', '2', '0', '7', '9', '1', '1']
['2020', '7', '9', '11']
import re
# \w 相当于[a-zA-Z0-9]
p = re.compile('\w')
print(p.findall("Official account: software testing test."))
# \w+ 与字母数字字符组匹配。
p = re.compile('\w+')
print(p.findall("Official account: software testing test."))
# \W 与非字母数字字符匹配。
p = re.compile('\W')
print(p.findall("Official account: software testing test."))
输出:
['O', 'f', 'f', 'i', 'c', 'i', 'a', 'l', 'a', 'c', 'c', 'o', 'u', 'n', 't', 's', 'o', 'f', 't', 'w', 'a', 'r', 'e', 't', 'e', 's', 't', 'i', 'n', 'g', 't', 'e', 's', 't']
['Official', 'account', 'software', 'testing', 'test']
[' ', ':', ' ', ' ', ' ', '.']
import re
# '*' 替换字符的出现次数。
p = re.compile('ab*')
print(p.findall("ababbaabbb"))
输出:
['ab','abb','a','abbb']
了解输出结果:
我们的RE为ab *,后接数字“ a”。'b'的值从0开始。
输出'ab'是有效的,因为单一的'b'伴随着单数'a'。
输出“ abb”有效,因为单数为“ a”和2个为“ b”。
输出“ a”有效,因为单数为“ a”并伴有0“ b”。
输出“ abbb”有效,因为单数为“ a”并伴有3个“ b”。
函数split() 通过出现字符或模式来分割字符串,找到该模式后,字符串中的其余字符将作为结果列表的一部分返回。 语法 :
re.split(pattern, string, maxsplit=0, flags=0)
第一个参数pattern表示正则表达式,string是将在其中搜索pattern并进行拆分的给定字符串,如果未提供maxsplit,则将其视为零“ 0”,如果提供任何非零值,则最多会发生许多分裂。如果maxsplit = 1,则字符串将仅拆分一次,从而产生一个长度为2的列表。这些标志非常有用,可以帮助缩短代码,它们不是必需的参数,例如:flags = re.IGNORECASE,在此拆分中,大小写将被忽略。
from re import split
# '\W+' 非字母数字字符或字符组
# 在找到“,”或空格“”时,split()将从该点拆分字符串
print(split('\W+', 'Software test, Software test, Software test'))
print(split('\W+', "Software test"))
# 这里的“:”、“”、“、”不是字母数字,因此是发生拆分的点
print(split('\W+', 'On 12th Jan 2016, at 11:02 AM'))
# '\d+' 表示数字字符或字符组
# 拆分仅在“12”、“2020”、“11”、“02”发生
print(split('\d+', '2020年1月12日上午11:02'))
输出:
['Software', 'test', 'Software', 'test', 'Software', 'test']
['Software', 'test']
['On', '12th', 'Jan', '2020', 'at', '11', '02', 'AM']
['', '年', '月', '日上午', ':', '\u200b']
函数sub() 语法:
re.sub(pattern,repl,string,count = 0,flags=0)
函数中的“ sub”代表SubString,在给定的字符串(第3个参数)中搜索某个正则表达式模式,并在找到子字符串模式后将其替换为repl(第2个参数),计数检查并保持次数发生这种情况。
import re
# 正则表达式模式“te”匹配“testing”和“test”处的字符串。
#由于忽略了大小写,因此使用标志“te”应与字符串匹配两次
#匹配后,“testing”中的“te”替换为“~*”,在“test”中,替换“te”。
print(re.sub('te', '~*' , 'Coldrain has focused on software testing test', flags = re.IGNORECASE))
# 考虑到大小写敏感度,“test”中的“te”将不会被重新调用。
print(re.sub('te', '~*' , 'Coldrain has focused on software testing test'))
# 当最大值为1时,替换次数为1
print(re.sub('te', '~*' , 'Coldrain has focused on software testing test', count=1, flags = re.IGNORECASE))
输出:
Coldrain has focused on software ~*sting ~*st
Coldrain has focused on software ~*sting ~*st
Coldrain has focused on software ~*sting test
函数subn() 语法:
re.subn(pattern,repl,string,count = 0,flags= 0)
subn()在所有方面都类似于sub(),除了提供输出的方式外。它返回一个元组,其中包含替换和新字符串的总数,而不仅仅是字符串。
import re
print(re.subn('te', '~*' , '雨寒已经关注了软件测试test'))
t = re.subn('te', '~*' , '雨寒已经关注了软件测试test', flags = re.IGNORECASE)
print(t)
print(len(t))
# 这将产生与sub()相同的输出
print(t[0])
输出:
('雨寒已经关注了软件测试~*st', 1)
('雨寒已经关注了软件测试test', 0)
2
雨寒已经关注了软件测试test
函数escape() 语法:
re.escape(字符串)
返回所有非字母数字都加反斜杠的字符串,如果要匹配其中可能包含正则表达式元字符的任意文字字符串,此方法很有用。
import re
# escape()返回每个非字母数字字符前带有反斜杠“\”的字符串
# 仅在第一种情况下“”,不是字母数字
# 在第二种情况下,“,插入符号“^”、“-”、“[]”、“\”不是字母数字
print(re.escape("I'm still writing at 1 a.m"))
print(re.escape("I Asked what is this [a-9], he said \t ^WoW"))
输出
I'm\ still\ writing\ at\ 1\ a\.m
I\ Asked\ what\ is\ this\ \[a\-9\],\ he\ said\ \ \ \^WoW