Python内置了正则表达式模块re。
分解复杂字符串最简单的方法是将字符串归纳为模式(pattern),然后编写描述该模式的正则表达式。
案例:
假设我们想分离某个食谱网站中的文本。每行内容如下所示:
ingredient = "Kumquat: 2 cups"
操作步骤如下:
(1)分析文本,概括模式,文本可以分为如下3个部分
(ingredient words): (amount digits) (unit words)
(2)导入re模块
(3)把模式改写为正则表达式
(4)编译模式
(5)匹配模式
In [1]: import re
In [2]: ingredient ='Kumquat:2 cup'
In [3]: pattern_text=r'(?P<ingredient>\w+):+(?P<amount>\d+)\s+(?P<unit>\w+)'
In [4]: pattern =re.compile(pattern_text)
In [5]: match= pattern.match(ingredient)
In [6]: pattern
Out[6]: re.compile(r'(?P<ingredient>\w+):+(?P<amount>\d+)\s+(?P<unit>\w+)', re.U
NICODE)
In [7]: match
Out[7]: <re.Match object; span=(0, 13), match='Kumquat:2 cup'>
In [8]: match.groups()
Out[8]: ('Kumquat', '2', 'cup')
代码解析:
正则表达式中有大量\,因此需要在字符串前加r前缀,保证不转义。
正则表达式中的(?P<name>...)标识了每个分组,也即给提取出来的内容命名。
\w+提取多个字符,\d+提取多个数字,\s+提取多个空格。
结果保存在groups()返回值中,格式为元组。
正则表达式基础:
正则表达式可以描述多种字符串模式。
前面已经介绍了一些字符类:
\w匹配任意字母或数字(a到z,A到Z,0到9);
\d匹配任意十进制数字;
\s匹配任意空格或制表符。
这些类还有相反的类:
\W匹配任意不是字母或数字的字符;
\D匹配任意不是数字的字符;
\S匹配任意不是某种空格或制表符的字符。
另外还有一些特殊符号:
+作为后缀表示匹配一个或多个前面的模式。\d+表示匹配一个或多个数字。要匹配一个普通的+字符,需要使用\+。
*作为后缀表示匹配零个或多个前面的模式。\w*表示匹配零个或多个字符。要匹配一个*字符,需要使用\*。
?作为后缀表示匹配零个或一个前面的表达式。这个字符还在其他地方使用,并且具有略微不同的含义。在(?P<name>...)中,它在()里面,用于定义分组的特殊属性。
.表示匹配任意单个字符。要匹配具体的.,需要使用\.。[]表示匹配集合中的任一元素。