Python文本处理(二):正则表达式

  • 定义

正则表达式由元字符及其不同组合构成,通过巧妙的构造正则表达式,可以匹配任意字符串,完成查找、替换等复杂的字符串处理任务。

注意:正则表达式只是形式上的检查,并不保证内容一定正确。

  • 模块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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值