1.将正则表达式拆成多行字符串
pattern = r((\d{2}|\(\d{2}\))?(\s|-)?\d{8}(\s*(ext|x|ext.)\s*\d{3,5})?)
可以使用3个单引号(或是双引号)将过长的字符拆成多行表达,这个概念也可以应用在正则表达式上,当我们适当地拆解后,可以为每一行加上批注,这样整个正则表达式就变得简单了。若是将上述pattern,拆解成下列表示法,整个就变得简单了。
pattern = r'''(
(\d{2}\(\d{2}\))? # 区域号码
(\s|-)? #区域号码与电话号码的分隔符
(\d{8}) #电话号码
(\s*(ext|ext.)\s*\d{3,5})? # 3-5位数的分机号码
)'''
第一行区域号码是2位数,可以接收有括号的区域号码,也可以接收没有括号的区域号码,例如,02或(02)都可以的。
第二行是设定区域号码与电话号码间的字符,可以接收空格符或-字符当作分隔符。
第三行是设定8位数数字的电话号码。
第四行是分机号码,分机号码可以用ext或ext.当作起始字符,空一定格数,然后接收3~5位数的分机号码。
2.re.VERBOSE
使用Python时,如果想在正则表达式中加上批注,必须配合使用re.VERBOSE参数,然后将此参数放在search()、findall()或compile()。
搜寻市区电话号码的应用,这个应用程序可以搜寻下列格式的电话号码。
12345678 # 没有区域号码
02 12345678 # 区域号码与电话号码有空格
02-12345678 # 区域号码与电话号码间使用 - 分隔
(02)-12345678 # 区域号码有小括号
02-12345678 ext 123 # 有分机号
02-12345678 ext. 123 # 有分机号,ext. 右边有.
import re
msg = '''02-88223349, (02)-26669999, 02-29998888 ext 123,
12345678, 02 33887766 ext. 12222'''
pattern = r'''(
(\d{2}|\(\d{2}\))? # 区域号码
(\s|-)? #区域号码与电话号码的分隔符
\d{8} #电话号码
(\s*(ext|ext.)\s*\d{3,5})? # 3-5位数的分机号码
)'''
phoneNUm = re.findall(pattern, msg, re.VERBOSE) # 回传搜寻结果
print(phoneNUm)
输出:
[('02-88223349', '02', '-', '', ''), ('(02)-26669999', '(02)', '-', '', ''), ('02-29998888 ext 123', '02', '-', ' ext 123', 'ext'), (' 12345678', '', ' ', '', ''), ('02 33887766 ext. 12222', '02', ' ', ' ext. 12222', 'ext.')]
这里没有输出电话号码,将\d{8}加上小括号就ok了
pattern = r'''(
(\d{2}|\(\d{2}\))? # 区域号码
(\s|-)? #区域号码与电话号码的分隔符
(\d{8}) #电话号码
(\s*(ext|ext.)\s*\d{3,5})? # 3-5位数的分机号码
)'''
[('02-88223349', '02', '-', '88223349', '', ''), ('(02)-26669999', '(02)', '-', '26669999', '', ''), ('02-29998888 ext 123', '02', '-', '29998888', ' ext 123', 'ext'), (' 12345678', '', ' ', '12345678', '', ''), ('02 33887766 ext. 12222', '02', ' ', '33887766', ' ext. 12222', 'ext.')]
使用小括号分组时的格式就应该是:
r'\d\d-\d\d\d\d\d\d\d\d' --> r'(\d{2})-(\d{8})'
3.关于参数的使用 re.IGNORECASE|re.DOTALL|re.VERBOSE
目前已经学了re.IGNORECASE、re.DOTALL、re.VERBOSE三个参数,可以分别在re.search()、re.findall()、re.match()或re.compile()方法内使用它们,但是一次只能放置一个参数,如果需要多个参数特性呢?那么可以使用通道概念 | ,如下:
datastr = re.search(pattern, msg, re.IGNORECASE|re.DOTALL|re.VERBOSE)