Python 正则表达式 - 使用 Re 处理正则表达式

Python 提供了标准库 re 模块来出来处理正则表达式。简单来说,re 模块包含了与正则表达式相关的函数、标志以及一个异常。

例如,re 模块的 findall 函数是使用最广泛的函数之一,以列表的形式返回文本中所有符合模式的字符串。比如:下面的列子就是使用 re.findall 获取文本中的所有数字:

>> import re
>> data = "alex is 10 years old. his math score is 99.5 but his english is 
 only 66.5."
>> re.findall('\d+\.?\d*', data)
['10', '99.5', '66.5']

如果希望 re 模块在模式匹配的时候忽略字符的大小写,在调用函数时,可以指定 flags 参数为 re.IGNORECASE ;如果希望 . 能匹配 r'.' 本身,指定 flags=re.DOTALL 即可。多个标志之间,使用 | 连接。

比如,下面的例子我们找到并返回所有的 python 字符串:

>> data = 'python2.7 Python3.6 Java8 C C++ C# PYTHON'
>> re.findall('python.*?\s*', data, flags=re.IGNORECASE|re.DOTALL)
['python', 'Python', 'PYTHON']

此外,如果我们定义的匹配模式中存在语法错误,则会抛出异常:

>> data = 'xxxxxxxxxpython2.7xxxxxxxxxxPython3.5'
>> re.findall('python[0-9]\.[0-9]', data, flags=re.I)
['python2.7', 'Python3.5']
>> re.findall('python[0-9]\.[0-9', data, flags=re.I)
error: unterminated character set at position 13

至此,我们已经了解了 re 模块的基本用法,包含了 re 模块的函数,标志以及异常。

下面,我们来学习 re 模块的一大特点,即两种使用正则表达式的方式:

  • 直接使用 re 模块中的函数。
  • 创建一个使用特定匹配模式编译的正则表达式对象,然后调用改对象的方法。

什么是编译的正则表达式呢?它是一个简单的对象,通过传递 模式re.compile 函数创建。具体的用法如下:

>> import re
>> data = 'python2.7 Python3.6 Java8 C C++ C# PYTHON'
>> re_obj = re.compile('python.*?\s*', flags=re.IGNORECASE|re.DOTALL)
>> re_obj.findall(data)
['python', 'Python', 'PYTHON']

编译与非编译方式使用正则表达式的区别,除了使用方式上小的不同之外,主要还是性能方面的差异。

如果需要处理的数据量很大,需要多次重复使用正则表达式,那么请使用编译后的正则表达式对象。

具体的性能差别,我们来看下面一个例子。首先,使用 seq 命令在 Linux 下产生 1000 万个整数并保存到 data.txt 文件中:

使用非编译的正则表达式匹配文件中的所有数字:

import re

def main():
    pattern = '[0-9]+'
    with open('data.txt') as f:
        for line in f:
            re.findall(pattern, line)
            
if __name__ == '___main__':
    mian()

运行结果:

使用编译的正则表达式匹配:

import re

def main():
    pattern = '[0-9]+'
    re_obj = re.compile(pattern)
    with open('data.txt') as f:
        for line in f:
            re_obj.findall(line)
            
if __name__ == '___main__':
    mian()

运行结果:

非编译版本的 Python 代码,耗时 0.025s,编译版本代码耗时 0.018s。小编这里运行的差异不是很大,一来数据量还不是特别大,二来小编是在服务器上运行的。

工作中,在数据量小的情况下,可以根据个人喜好选择使用正则表达式的方式。但如果数据量较大的情况下,建议使用编译版本的正则表达式。

注:Linux 下的 time 工具可以用于统计程序的运行时间。

你可能感兴趣的:(Python 正则表达式 - 使用 Re 处理正则表达式)