正则介绍,创建、匹配Regex对象
1 前面的电话号码查找程序能工作,但是 使用了很多代码,做的事情却有限;
isPhoneNumber()函数有17行,但只能查找一种电话号码模式。像415.555.4242或者(415)555-4242这样的电话号码格式,该怎么查?
如果电话号码有分机,例如415-555-4242 x99,该怎么查?
所以isPhoneNumber()函数在验证的时候会失败。
2 正则表达式,简称为regex,是文本模式的描述方法。
例如,\d 是一个正则表达式,表示一位数字字符,即任何一位0到9的数字。
python使用正则表达式 \d\d\d-\d\d\d-\d\d\d,来匹配前面isPhoneNumber()函数匹配的同样文本:3个数字、一个短横线、3个数字、一个短横线、4个数字
所有其他字符串都不能匹配 \d\d\d-\d\d\d-\d\d\d 正则表达式
但是 正则表达式可以复杂得多。
例如:在一个模式后加上花括号包围的3({3}),就是说,"匹配这个模式3次"。所以较短的正则表达式 \d{3}-\d{3}-\d{4},也可以匹配正确的电话号码格式。
python中所有正则表达式的函数都在re模块中。在交互式环境中输入一下代码,导入该模块
import re
注意:在实际的开发例子中,都需要用到re模块,所以要记得在每个脚本开始处导入它,或者重新启动IDLE时。
否则会报错,错误消息 NameError:name're'is not defined
向re.compile()传入一个字符串值,表示正则表达式,它将返回一个Regex模式对象(或者就简称为Regex对象)
要创建一个regex对象来匹配电话号码模式,就在交互式环境下输入以下代码:
回忆以下,\d 表示"一个数字字符",\d\d\d-\d\d\d-\d\d\d\d是正确电话号码模式的正则表达式。
phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
现在 phoneNumRegex 变量包含了一个 Regex对象
Regex 对象的search()方法查找传入的字符串,寻找该正则表达式的所有匹配。
如果字符串中没有找到该正则表达式模式,search()方法将返回None。如果找到了该模式,search()方法返回一个Match。
Match有一个group()方法,它返回被查找字符串中实际匹配的文本,
例如:
phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
mo = phoneNumRegex.search('My number is 415-555-4242.')
print('Phone number found:' + mo.group)
变量名 mo是一个通用的名称,用于Match对象。这个例子可能看起来有点复杂,但它比前面的isPhoneNumber.py程序短很多,并且做的事情一样。
以上代码的步骤:
1 将期待的模式传递给re.compile(),并且将的得到的Regex对象保存在phoneNumRegex中。
2 在phoneNumRegex上调用search(),向它传入想查找的字符串
3 查找的结果保存在变量mo中
在这个例子中,
1 知道模式会在这个字符串中找到,所以知道会返回一个Match对象。
2 知道mo包含一个Match对象,而不是空值,就可以在mo变量上调用group(),返回匹配的结果。
3 将mo.group()写在打印语句中,显示出完整的匹配,即 415-555-4242
python使用正则表达式的步骤:
1 用 import re 导入正则表达式
2 用 re.compile()函数创建一个Regex对象(记得使用原始字符串)
3 向Regex对象的search()方法传入想查找的字符串。它将返回一个Match对象
4 调用Match对象的group()方法,返回实际匹配文本的字符串
可利用网页的正则表达式测试程序,可以清楚的表示,一个正则表达式如何匹配输入的一段文本
推荐的测试程序位于 http://regexpal.com/
flameluo