正则RE
简单匹配,在python中使用正则表达式有几个步骤,下面对这些步骤做一下说明:
- 用import re导入正则表达式模块
- 用re.compile()函数创建一个Regex对象,匹配模式(记得使用原始数据)
- 像Regex对象的search()方法传入想查找匹配的字符串。它返回一个Match对象
- 调用Match对象的group()方法,返回实际匹配文本的字符串
代码如这样:
import re phoneNumber = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') mo = phoneNumber.search('My number is 415-333-3432') print('Phone number found:'+mo.group())
可以利用括号分组
import re phone = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)') mo = phone.search('my phone number is 324-123-3456')
运行group分组:
mo.group() '324-123-3456' mo.group(1) '324' mo.group(2) '123-3456'
如果想要一次获取所有的分组,请使用groups()方法。
>>> mo.groups() ('324', '123-3456')
匹配模式:
? 匹配这个问号之前的分组零次或一次
* 匹配这个星号之前的分组零次或多次
+ 匹配这个加号之前的分组一次或多次
{m} 匹配前边分组字符m次
{m,n} 匹配至少m次、至多n次前面的分组
{m,} 匹配m次或更多次前面的分组
^spam 匹配的字符串必须以spam开始
spam$ 匹配的字符串必须以spam结束
. 匹配除换行符之外的所有字符
\d 、\w 、\s 分别匹配数字、单词和空格,tab键
\D 、\W 、 \S分别匹配数字、单词和空格,tab键之外的所有字符
r'^\d+$' 匹配从开始到结束都是数字的字符串
.* 表示任意文本
| 匹配多个模式中的一个
r'(apples|bananas|piples)'
也可以建立自己的字符分类。使用方括号,例如字符分类[aeiouAEIOU]将匹配所有元音字符,不论大小写。re.compile(r'[aeiouAEIOU]')
字符分类[^aeiouAEIOU]将匹配所有非元音字符,不论大小写。re.compile(r'[^aeiouAEIOU]')
>>> wholeStringIsNum = re.compile(r'^\d+$') >>> wholeStringIsNum.search('123456789') <_sre.SRE_Match object; span=(0, 9), match='123456789'>
除了search方法外,Regex对象也有一个findall()方法。
search()将返回一个Match对象,包含被查找字符串中的“第一次”匹配的文本。
findall()将返回一组字符串,包含被查找字符串中的所有匹配。
- 如果正则表达式中没有分组,则findall()方法将返回一个字符串列表
- 如果正则表达式中有分组,则findall()方法将返回元组的列表。每个元组的表项就是正则表达式中每个分组匹配字符串
废话不多说了,直接上代码。
>>> phone = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)') >>> mo1 = phone.search('Cell:231-333-4567 Work:211-555-0000') >>> mo1.group() '231-333-4567' >>> mo2 = phone.findall('Cell:231-333-4567 Work:211-555-0000') >>> mo2 [('231', '333-4567'), ('211', '555-0000')] >>> group1 = re.compile(r'(\d\d\d)-(\d\d\d)-(\d\d\d\d)') >>> group1.findall('Cell:231-333-4567 Work:211-555-0000') [('231', '333', '4567'), ('211', '555', '0000')]
import re re.match #从开始位置开始匹配,如果开头没有则无 re.search #搜索整个字符串 re.findall #搜索整个字符串,返回一个list
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
re.search(r'[a-z]+','liuyaN1234ab9').group() #返回'liuya' re.search(r'[a-z]+','liuyaN1234ab9', re.I).group() #返回'liuyaN',对大小写不敏感
正则表达式实例
字符类
实例 | 描述 |
---|---|
[Pp]ython | 匹配 "Python" 或 "python" |
rub[ye] | 匹配 "ruby" 或 "rube" |
[aeiou] | 匹配中括号内的任意一个字母 |
[0-9] | 匹配任何数字。类似于 [0123456789] |
[a-z] | 匹配任何小写字母 |
[A-Z] | 匹配任何大写字母 |
[a-zA-Z0-9] | 匹配任何字母及数字 |
[^aeiou] | 除了aeiou字母以外的所有字符 |
[^0-9] | 匹配除了数字外的字符 |
特殊字符类
实例 | 描述 |
---|---|
. | 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。 |
\d | 匹配一个数字字符。等价于 [0-9]。 |
\D | 匹配一个非数字字符。等价于 [^0-9]。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
\w | 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 |
\W | 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 |