正则表达式
字符匹配
普通字符:大多数字符和字母都会和自身匹配
元字符:.^$*+?{}[]|()\
re模块
re是python中的正则表达式模块,re模块中包含了正则表达式的语法
API方法
- findAll() 按照指定的模式查找所有的符合的元素
- search() 寻找到第一个符合模式的元素就会停止寻找,会返回一个对象
- compile(reg) 先将正则表达式编译为一个对象,然后再使用编译后的对象调用p.search p.findAll() 后跟要匹配的字符串
- sub() 还需要一个额外的参数replacement,它会把source中所有匹配的pattern替换成replacement
rep = re.search('aaa','aaacccaaa')
print(rep.group())
元字符解释
- . 代表除换行符(\n)外的任意字符,只能代指任意一个字符
- ^ 匹配开头
- $ 匹配结束
- * 重复匹配 表示* 前面的元素出现0到多次
re.findall('a*','aaaabbbb')
- 表示匹配1到多次,至少有1次
- ?表示匹配0到1次,至多1次
- {n,m}表示匹配n到m次 贪婪匹配
pre(m) m个连续的pre
pre(m,n) m到n个连续的pre,尽可能多地匹配
pre(m,n)? m到n个连续的pre,尽可能少的匹配
- []字符集,字符集内的内容代表范围,[m,n]表示m或者是n的一个 [^n]表示匹配除n以外的
字符集[]还有取消元字符的特殊功能,在[]中的元字符没有特殊功能的定义 例如 [*] 中的 * 就代表 * 这个字符 -除外 - () 分组功能作为一个整体
- | 或者
expr1|expr2 匹配expr1或expr2
[a-z] 表示a-z范围中的任意一个字母
- \ 反斜杠后边跟元字符去除特殊功能,反斜杠后跟普通字符实现特殊功能
- \d 代表数字 相当于[0-9]
- \D 匹配任何非数字字符 相当于[^0-9]
- \s 匹配任何空白字符 [\t\n\r\f\v]
- \S 匹配任何非空白字符 [^ \t\n\r\f\v]
- \w 匹配任何字母数字字符 [a-zA-Z0-9]
- \W 匹配任何非字母数字字符 [^a-zA-Z0-9]
- \b 匹配一个特殊字符的( ,#¥等)边界。
- \B 匹配非单词边界
Python使用正则表达式
使用正则表达式,相关的功能都位于标准库模块re中。需要先定义一个用于匹配的模式字符串以及一个匹配的对象:源字符串
result = re.match('You','Youareme')
对于更加复杂的匹配,可以先对模式进行编译以加快匹配速度,然后就可以直接使用编译好的模式进行匹配
>>> youpattern = re.compile('You')
>>> youpattern.match('You are mine')
<_sre.SRE_Match object; span=(0, 3), match='You'>
使用match()进行准确匹配
判断单词'Young'是以单词'You'开头
>>> source = 'Young'
>>> m = re.match('You',source)
>>> if m:
... print(m.group())
...
You
- match()函数用于查看源是否以指定模式开头,search()可以检测任何位置的匹配
>>> mm = re.search('ung',source)
>>> if mm:
... print(mm.group())
...
ung
使用findall()寻找所有匹配
findall()会返回指定的模式串在源串中出现的所有列表
>>> source_all = 'hello hello hello how are you'
>>> m = re.find
>>> m = re.findall('o',source_all)
>>> m
['o', 'o', 'o', 'o', 'o']
使用split() 按匹配切分
split()将一个字符串切分成由一系列子串组成的列表
>>> m = re.split('l',source_all)
>>> m
['he', '', 'o he', '', 'o he', '', 'o how are you']
使用sub()替换匹配
使用sub替换匹配和字符串的replace有些类似,只不过使用的是模式而不是文本串
>>> m = re.sub('l','?',source_all)
>>> m
'he??o he??o he??o how are you'
定义模式匹配的输出
当使用match()或search()时,所有的匹配会以m.group()的形式返回到对象m中。如果使用括号将自己的某一模式包裹起来,括号中模式匹配得到的结果归入自己的froup中,如果调用m.groups()可以得到包含这些匹配的元组,使用(? P <name> expr) 这样的模式会匹配expr,并将匹配结果存储到名为name的组中