目录
众所周知,电话号码由三部分组成,例如:132-3233-7777,是由3位网号+4位HLR号+4位的个人代码。假定我们构建一个函数,筛选广电号段的电话号码(中国广电号段:192),有如下操作
def phoneNumber(text):#1
if len(text) != 11:#2
return False
if text[0:3] != '192':#3
return False
for i in range(0,11):#4
if not text[i].isdecimal():#4
return False
return True
print(phoneNumber('12345557656'))
print(phoneNumber('19233333333'))
首先#1使用def定义函数phoneNumber(),#2判断文本长度是否等于11位,若不等于,则返回False。#3遍历文本前三位,如果不等于192,则返回False,#4遍历全11位,如果不是纯数字,则返回False。
输出如下:
可以看到相当麻烦,接下来,以正则表达式查找文本。
import re
phoneNumber = re.compile(r'1\d\d\d\d\d\d\d\d\d\d')
mo = phoneNumber.search('My number is 17543405207')
print("My phone number is " + mo.group())#变量名mo是一个通用的名称
输出如下
第一步:使用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\d)')
mo = phoneNumber.search('My phone number is 175-4340-5207')
mo.group(1)
mo.group(0)
mo.group(2)
输出如下
如果需要一次获取全部分组,使用groups()
字符|被称为管道,希望匹配许多表达式中的一个时,可以有如下操作
color = re.compile(r'red|blue')
mo1 = color.search('red and blue')
mo1.group()
mo2 = color.search('blue and red')
mo2.group()
如果希望匹配'Batman'、'Batmobile'、'Batcopter'
bat = re.compile(r'Bat(man|mobile|copter)')
mo = bat.search('Batmobile lost a wheel')
mo.group()
mo.group(1)
dio用mo.group()返回完全匹配的文本'Batmobile',而mo.group(1)只是返回了第一个括号分组内的文本'mobile'
如果需要匹配真正的管道字符,就要用到转义字符。