- 定义
正则表达式由元字符及其不同组合构成,通过巧妙的构造正则表达式,可以匹配任意字符串,完成查找、替换等复杂的字符串处理任务。
注意:正则表达式只是形式上的检查,并不保证内容一定正确。
- 模块re
re标准库提供了正则表达式操作做需要的功能。既可以直接使用re模块的方法处理字符串,也可以吧模式编译成正则表达式对象再使用。
方法 | 功能说明 |
compile(pattern[,flags] | 创建模式对象 |
escape(string) | 将字符串中的所有特殊正则表达式转义 |
findall(pattern,string[,flags] | 列出字符串中所有模式的匹配项 |
finditer(pattern,string,flags = 0) | 返回包含所有匹配项的迭代对象,其中每个匹配项都是match对象 |
fullmatch(pattern,string,flags = 0) | 尝试把模式作用于整个字符串,返回Match对象或None |
match(pattern,string[,flag]) | 从字符串的开始处匹配模式,返回Match对象或None |
purge() | 清空正则表达式缓存 |
search(pattern,string[,flags]) | 在整个字符串中寻找模式,返回Match对象或None |
split(pattren,string[,maxsplit = 0]) | 根据模式匹配项分割字符串 |
sub(pat,repl,string[,count = 0]) | 讲字符串中所有pat的匹配项用repl替换,返回新字符串,repl可以是字符串或返回字符串的可调用对象作用于每个匹配的Match对象 |
subn(pat,repl,string[,count = 0]) | 将字符串中所有的pat的匹配项用repl替换,返回包含新的字符串和替换次数的二元组,repl可以是字符串的可调用对象,该调用对象作用于每个匹配的Match对象 |
pat = '[a-zA-Z]+'
re.findall(pat,text) #查找所有单词
Out[10]: ['alpha', 'beta', 'gamma', 'delta']
#将指定字母大写处理
re.sub('a',lambda x:x.group(0).upper(),'aaasaa aa acca ac')
Out[12]: 'AAAsAA AA AccA Ac'
#大小写互换
re.sub('[a-zA-z]',lambda x:chr(ord(x.group(0))^32),'aaa aBc abcde')
Out[13]: 'AAA AbC ABCDE'
#返回新字符串和替换次数
re.subn('a','dfg','aaa abc a bcde')
Out[14]: ('dfgdfgdfg dfgbc dfg bcde', 5)
#删除空格的几种方法
import re
s = 'aaa b b bbb c d c efff '
print(' '.join(s.split()))
print('='*30)
print(' '.join(re.split('[\s]+',s.strip())))
print(' '.join(re.split('\s+',s.strip())))
print('='*30)
print(re.sub('\s+',' ',s.strip()))
pattern = re.compile(r'\bB\w+\b') #查找以B开头的单词
pattern = re.compile(r'\w+g\b') #查找以字母g结尾的单词
pattern = re.compile(r'\b[a-zA-Z]{3}\b') #查找3个字母长的单词
pattern = re.compile(r'\b\w*a\w*\b') #查找所有含有字母a的单词
pattern = re.compile(r'\w+ly') #查找所有以字母组合ly结尾的单词
pattern = re.compile(r'(?< = \w\s)never(?=\s\w)') #查找不在句子开头和结尾的never
pattern = re.compile(r'(?<=\w\s)never') #查找位于句子末尾的单词
pattern = re.compile(r'(?:is\s)better(\sthan)') #查找前面是is的better than组合
pattern = re.compile(r'\b(?i)n\w+\b') #查找以n或N字母开头的所有单词
pattern = re.compile(r'(?<!not\s)be\b') #查找前面没有单词not的单词be
pattern = re.compile(r'(\b\w*(?P<f>\w+)(?P=f)\w*\b') #匹配有连续相同字母的单词
pattern.find() #使用正则表达式对象的findall()方法
pattern.match() #从字符串开头开始匹配,失败返回空值
matchResult = pattern.search() #在整个字符串中搜索
matchResult.span() #返回search里找到的位置
- 常用
元字符 | 功能说明 |
. | 匹配除换行符以外的任意单个字符 |
* | 匹配位于*之前的字符或子模式的0次或多次出现 |
+ | 匹配位于+之前的字符或子模式的1次或多次出现 |
- | 在[]之内用来表示范围 |
^ | 匹配以^后面的字符或模式开头的字符串 |
$ | 匹配以$前面的字符或模式结束的字符串 |
? | 匹配位于"?"之前的0个或1个字符或子模式,即问好之前的字符或子模式是可选的。紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,表示“非贪心”匹配模式,“非贪心”模式匹配尽可能短的字符串,而默认的“贪心”模式匹配尽可能长的字符串。例如,在字符串“oooo“中,”o+?"只匹配单个o,而o+匹配所有o |
\ | 表示位于\之后的转义字符 |
\num | 此处的num是一个正整数,表示前面字符或子模式的编号。例如,“(.)\1”匹配两个连续的字符 |
\f | 匹配一个换符页 |
\n | 匹配一个换行符 |
\r | 匹配一个回车键 |
\b | 匹配单词头或单词尾 |
\B | 与\b含义相反 |
\d | 匹配任何数字,相当于[0-9] |
\D | 与\d含义相反[^0-9] |
\s | 匹配任何空白字符,包括空格、制表符、换页符,与[\f\n\r\t\v]等效 |
\S | 与\s含义相反 |
\w | 匹配任何字母、数字以及下划线,相当于[a-zA-Z0-9] |
\W | 与\w含义相反,与[^A-Za-z0-9] |
() | 将位于()内的内容作为一个整体对待 |
{} | 按{}中指定次数进行匹配,例如,{3,8}表示前面的字符或模式至少重复三次而最多重复8次 |
[] | 匹配位于[]中的任意一个字符 |
[^xyz] | ^放在[]内表示反向字符集,匹配除x,y,z之外的任何字符 |
[a-z] | 字符范围,匹配指定范围内的任何字符 |
[^a-z] | 反向范围字符,匹配除小写英文字母之外的任何字符 |
\\ | 如果以\开头的元字符与转义字符相同,则需要使用\\,或者使用原始字符串 |
本章小结
(1)正则表达式使用预定义的模式去匹配一类具有共同特征的字符串,可以快速、准确的完成复杂的查找、替换等处理要求,比字符串自身提供的方法提供了更加强大的处理功能。
(2)正则表达式使用圆括号表示一个子模式,圆括号里的内容作为一个整体对待。
(3)正则表达式只是形式上进行检查,并不保证内容一定正确。
(4)正则表达式模块或正则表达式对象的match()方法和search()方法匹配后都会返回Match对象。
习题
#检查重复单词
a = "This is is a desk."
l = []
for i in a.split(" "):
if i not in l:
l.append(i)
result = " ".join(l)
print(result)
#查找3个字母长的单词
import re
pattern = re.compile(r'\b[a-zA-Z]{3}\b') #查找3个字母长的单词
print(pattern.findall(a))