高级正则表达式技术(Python版)

正则表达式是从信息中搜索特定的模式的一把瑞士军刀。它们是一个巨大的工具库,其中的一些功能经常被忽视或未被充分利用。今天我将向你们展示一些正则表达式的高级用法。


举个例子,这是一个我们可能用来检测电话美国电话号码的正则表达式:


r'^(1[-s.])?(()?d{3}(?(2)))[-s.]?d{3}[-s.]?d{4}$'


我们可以加上一些注释和空格使得它更具有可读性。


r'^'

r'(1[-s.])?' # optional '1-', '1.' or '1'

r'(()?'      # optional opening parenthesis

r'd{3}'      # the area code

r'(?(2)))'   # if there was opening parenthesis, close it

r'[-s.]?'    # followed by '-' or '.' or space

r'd{3}'      # first 3 digits

r'[-s.]?'    # followed by '-' or '.' or space

r'd{4}$'    # last 4 digits


让我们把它放到一个代码片段里:


import re

numbers = [ "123 555 6789",

           "1-(123)-555-6789",

           "(123-555-6789",

           "(123).555.6789",

           "123 55 6789" ]

for number in numbers:

   pattern = re.match(r'^'

                  r'(1[-s.])?'           # optional '1-', '1.' or '1'

                  r'(()?'                # optional opening parenthesis

                  r'd{3}'                # the area code

                  r'(?(2)))'             # if there was opening parenthesis, close it

                  r'[-s.]?'              # followed by '-' or '.' or space

                  r'd{3}'                # first 3 digits

                  r'[-s.]?'              # followed by '-' or '.' or space

                  r'd{4}$s*',number)    # last 4 digits

   if pattern:

       print '{0} is valid'.format(number)

   else