正则表示式——6.处理比较复杂的正则表示法

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笨小古

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值