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


    1.将正则表达式拆成多行字符串

    pattern = r((\d{2}|\(\d{2}\))?(\s|-)?\d{8}(\s*(ext|x|ext.)\s*\d{3,5})?)

    可以使用3个单引号(或是双引号)将过长的字符拆成多行表达,这个概念也可以应用在正则表达式上,当我们适当地拆解后,可以为每一行加上批注,这样整个正则表达式就变得简单了。若是将上述pattern,拆解成下列表示法,整个就变得简单了。

    1. pattern = r'''(
    2. (\d{2}\(\d{2}\))? # 区域号码
    3. (\s|-)? #区域号码与电话号码的分隔符
    4. (\d{8}) #电话号码
    5. (\s*(ext|ext.)\s*\d{3,5})? # 3-5位数的分机号码
    6. )'''

    第一行区域号码是2位数,可以接收有括号的区域号码,也可以接收没有括号的区域号码,例如,02或(02)都可以的。

    第二行是设定区域号码与电话号码间的字符,可以接收空格符或-字符当作分隔符。

    第三行是设定8位数数字的电话号码。

    第四行是分机号码,分机号码可以用ext或ext.当作起始字符,空一定格数,然后接收3~5位数的分机号码。

    2.re.VERBOSE

    使用Python时,如果想在正则表达式中加上批注,必须配合使用re.VERBOSE参数,然后将此参数放在search()、findall()或compile()。

    搜寻市区电话号码的应用,这个应用程序可以搜寻下列格式的电话号码。

    1. 12345678 # 没有区域号码
    2. 02 12345678 # 区域号码与电话号码有空格
    3. 02-12345678 # 区域号码与电话号码间使用 - 分隔
    4. (02)-12345678 # 区域号码有小括号
    5. 02-12345678 ext 123 # 有分机号
    6. 02-12345678 ext. 123 # 有分机号,ext. 右边有.
    1. import re
    2. msg = '''02-88223349, (02)-26669999, 02-29998888 ext 123,
    3. 12345678, 02 33887766 ext. 12222'''
    4. pattern = r'''(
    5. (\d{2}|\(\d{2}\))? # 区域号码
    6. (\s|-)? #区域号码与电话号码的分隔符
    7. \d{8} #电话号码
    8. (\s*(ext|ext.)\s*\d{3,5})? # 3-5位数的分机号码
    9. )'''
    10. phoneNUm = re.findall(pattern, msg, re.VERBOSE) # 回传搜寻结果
    11. 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了

    1. pattern = r'''(
    2. (\d{2}|\(\d{2}\))? # 区域号码
    3. (\s|-)? #区域号码与电话号码的分隔符
    4. (\d{8}) #电话号码
    5. (\s*(ext|ext.)\s*\d{3,5})? # 3-5位数的分机号码
    6. )'''
    [('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)
  • 相关阅读:
    JAVA学习第九课:用Swing开发GUI程序
    使用proxy把后端返回的图片域名替换成目标域名
    小试牛刀Linux信号
    Linux性能优化-网络篇-DNS问题排查
    96. 不同的二叉搜索树
    Check for degenerate boxes检查退化框
    五分钟搭建博客系统 OK?
    SPA项目开发之首页导航+左侧菜单
    关于图片裁剪怎么弄,这里分享几款软件
    深度解析NLP文本摘要技术:定义、应用与PyTorch实战
  • 原文地址:https://blog.csdn.net/weixin_51995147/article/details/126260911