Python 的 re 模块(Regular Expression 正则表达式)提供各种正则表达式的匹配操作,在文本解析、复杂字符串分析和信息提取时是一个非常有用的工具,使用python的re模块,尽管不能满足所有复杂的匹配情况,但足够在绝大多数情况下能够有效地实现对复杂字符串的分析并提取出相关信息。python 会将正则表达式转化为字节码,利用 C 语言的匹配引擎进行深度优先的匹配。
【1】元字符:^ $ * + ? {} [] | () \
.表示任意字符
[]用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字符集,对于字符集中的字符可以理解成或的关系。
^ 如果放在字符串的开头,则表示取非的意思。[^5]表示除了5之外的其他字符。而如果^不在字符串的开头,则表示它本身。
具有重复功能的元字符:
* 对于前一个字符重复0到无穷次
对于前一个字符重复1到无穷次
?对于前一个字符重复0到1次
{m,n} 对于前一个字符重复次数在为m到n次,其中,{0,} = *,{1,} = , {0,1} = ?
{m} 对于前一个字符重复m次
\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s 匹配任何空白字符;它相当于类 [ fv]。
\S 匹配任何非空白字符;它相当于类 [^ fv]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]。
【findall】
# re.findall #遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。 # 格式: # re.findall(pattern, string, flags=0) #完全比配 ret=re.findall('w\w{2}l','hello world') print(ret) #^ 开始,这里是以h开始的表达式中间任意三个字符 ret=re.findall('^h...o','hellogdgdfg') print(ret) # $结尾 ret=re.findall('a..x$','fdfddfaghx') print(ret) # *重复匹配[0,+00] ret=re.findall('a.*li','afjkadfdfsdliw') print(ret) ret2=re.findall('ab*','saabgfabffdfgab') print(ret2) # + [1,+00] 比配到具体的会全部显示出来 ret=re.findall('a+b','aaaaabfdfaabfdfdabddb') print(ret) # ?[0,1] 匹配到,只会显示要比配数据重复的会去掉不,比配到一个也显示 ret=re.findall('a?b','aaaabdfasbfdsabfg') print(ret) #{num} 比配具体到有具体个数 # ret=re.findall('a{5}b','vaaaaaab') # print(ret) # #{num-nums} 可以有多少个数 # ret1=re.findall('a{0,4}b','vaffaaabbbb') # print(ret1)
#使用Python的r前缀,就不用考虑转义的问题
#r是raw(原始)的意思。因为在表示字符串中有一些转义符,如表示回车'\n'。如果要表示\表需要写为'\\'。但如果我就是需要表示一个'\'+'n',不用r方式要写为:'\\n'。但使用r方式则为r'\n'这样清晰多了。
#print(re.findall(r'I\b','hello, I am a kebi'))
【3】finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]):
搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。
p = re.compile(r'\d+') for m in p.finditer('one1two2three3four4'): print m.group()
【4】search
*注:match和search一旦匹配成功,就是一个match object对象,而match object对象有以下方法:
- group() 返回被 RE 匹配的字符串
- start() 返回匹配开始的位置
- end() 返回匹配结束的位置
- span() 返回一个元组包含匹配 (开始,结束) 的位置
- group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。
a. group()返回re整体匹配的字符串,
b. group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常
c.groups()groups() 方法返回一个包含正则表达式中所有小组字符串的元组,从 1 到所含的小组号,通常groups()不需要参数,返回一个元组,元组中的元就是正则表达式中定义的组。
print(re.search('\dcom','www.4comrunoob.5com').group()) #4com import re a = "123abc456" print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)) #123abc456,返回整体 print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)) #123 print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)) #abc print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)) #456 ###group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。###
# ret=re.search('(?P<id>\d{3})/(?P<name>\w{3})','weeew34ttt123/ooo')
# print(ret)
# print(ret.group('id'))
# print(ret.group('name'))
【5】match:从字符串的起始位置匹配,若起始位置不符合正则表达式,则返回空
m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345') print(m.group(0))#group(0)永远是原始字符串 print(m.group(1)) print(m.group(2))
【6】split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]):
按照能够匹配的子串将string分割后返回列表。maxsplit用于指定最大分割次数,不指定将全部分割。
import re p = re.compile(r'\d+') print p.split('one1two2three3four4') ### output ### # ['one', 'two', 'three', 'four', '']
【7】compile() 编译正则表达式模式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)
import re obj=re.compile('\.com') ret=obj.findall('file.comerNBA') print(ret) print(re.findall('\.com','file.comerNBA')) tt = "Tina is a good girl, she is cool, clever, and so on..." rr = re.compile(r'\w*oo\w*') print(rr.findall(tt)) #查找所有包含'oo'的单词 执行结果如下: ['good', 'cool']
【8】sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]):
使用repl替换string中每一个匹配的子串后返回替换后的字符串。
当repl是一个字符串时,可以使用\id或\g<id>、\g<name>引用分组,但不能使用编号0。
当repl是一个方法时,这个方法应当只接受一个参数(Match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。
count用于指定最多替换次数,不指定时全部替换。
import re print(re.sub('a..x','sNBb','hfjasalexdens')) #---------------- p = re.compile(r'(\w+) (\w+)') s = 'i say, hello world!' print p.sub(r'\2 \1', s) def func(m): return m.group(1).title() + ' ' + m.group(2).title() print p.sub(func, s) ### output ### # say i, world hello! # I Say, Hello World!
【9】subn(repl, string[, count]) |re.sub(pattern, repl, string[, count]):
返回 (sub(repl, string[, count]), 替换次数)。
import re p = re.compile(r'(\w+) (\w+)') s = 'i say, hello world!' print p.subn(r'\2 \1', s) def func(m): return m.group(1).title() + ' ' + m.group(2).title() print p.subn(func, s) ### output ### # ('say i, world hello!', 2) # ('I Say, Hello World!', 2)