创建正则表达式
import re
phoneNumber = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
通过在字符串的第一个引号之前加上r,可以将该字符串标记为原始字符串,它不包括转义字符。
正则表达式
利用括号分组
phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
mo = phoneNumRegex.search('My number is 415-555-4242.')
mo.group(1) 415
mo.group(2) 555-4242
mo.group(0) 415-555-4242
mo.groups()返回多个值的元组,可以使用多重赋值的技巧,每个值赋给一个独立的变量
areaCode, mainNumber = mo.groups()
用[]括号匹配其中的一个字符
匹配方括号里面其中一个字符
用[^]括号匹配不在方括号内的任意字符
匹配不在方括号内的任意字符
用管道匹配多个分组
heroRgex = re.compile(r'Batman|Tina Fey')
mo1 = heroRegex.search('Batman and Tina Fey.)
只返回第一次出现的匹配文本,不是两个都显示出来
用问号实现可选匹配
字符?表明它前面的分组(分组使用使用小括号括起来)在这个模式中是可选的,可以存着也可以不存在
batRegex = re.compile(r'Bat(wo)?man')
mo1 = batRegex.search('The Adventures of Batman')
mo1.group() 'Batman'
上面的例子中就是wo是可选的分组,wo将出现零次或一次。
用星号匹配零次或多次
字符*表明它前面的分组可以完全不存在,或一次又一次地重复
batRegex = re.compile(r'Bat(wo)*man')
mo1 = batRegex.search('The Adventures of Batwowoman')
mo1.group() 'Batwowoman'
上面的例子中就是wo是可选的分组,wo将出现零次或任意多次。
用加号匹配一次或多次
字符+表明它前面的分组至少匹配一次
batRegex = re.compile(r'Bat(wo)+man')
mo1 = batRegex.search('The Adventures of Batman')
mo1 == None True
上面的例子中就是wo最少匹配一次
用花括号匹配特定次数
匹配一个分组特定次数
- (Ha){3} 匹配3次
- (Ha){3,} 匹配3次或更多次数
- (Ha){,5} 匹配0到5次
正则表达式里的贪心和非贪心模式
正则表达式的原则是匹配的越多越好(贪心模式),非贪心模式在模式后面加个?号
nongreedyHaRegex = re.compile(r'(Ha){3,5}?')
mo2 = nongreedyHaRegex.search('HaHaHaHaHa')
mo2.group() 'HaHaHa'
findall()
返回一组字符串,包括被查找字符串中的所有匹配
phoneNumber = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
phoneNumber.findall('Cell: 415-555-999 Work:212-555-0000')
['415-555-999','212-555-0000']
如果在正则表达式中有分组,那么findall将返回元组的列表。每个元组表示一个找到的匹配,其中的项就是正则表达式中每一个分组的匹配字符串。
phoneNumber = re.compile(r'(\d\d\d)-(\d\d\d)-(\d\d\d\d)')
phoneNumber.findall('Cell:415-555-9999 Work:212-555-0000')
[('415','555','9999'),('212','555','0000')]
插入字符和美元字符
^表示必须以什么为开始,$表示必须以什么为结束
字符分类
常用字符分类的缩写代码
缩写字符分类 | 表示 |
---|---|
\d | 0到9的任何数字 |
\D | 除0到9的数字以外的任何字符 |
\w | 任何字母、数字或下划线字符(可以认为是匹配“单词”字符) |
\W | 除字母、数字和下划线以外的任何字符 |
\s | 空格、制表符或换行符(可以理解为匹配“空白”字符 |
\S | 除空格、制表符和换行符以外的任何字符 |
通配字符
.(句号)字符称为“通配符”。匹配了换行之外的所有字符,只匹配一个字符
- .*匹配所有字符
- .+匹配除了空之外的所有字符
re.compile()的参数
- re.DOTALL 可以让.*匹配包括换行符的所有字符
- re.I或re.IGNORECASE 可以不区分大小写
- re.VERBOSE 可以将正则表达式分行,并可以注释
用sub()方法替换字符串
第一个参数是取代发现的匹配,第二个参数是要操作取代的字符串