Python瓦匠 —— 正则表达式(三)

贪心和非贪心匹配

Python正则表达式默认是贪心的,在有二异的情况下,他们会尽可能的匹配最长的字符串。

所以当我们使用(Ha){3,5}匹配'HaHaHaHaHa'的时候回匹配到'HaHaHaHaHa'。

而{}?既是非贪心版本,它会尽可能的匹配最短的字符串。

例如:

import re

greedyHaRegex = re.compile(r'(Ha){3,5}')
mo = greedyHaRegex.search('HaHaHaHaHa')
print(mo.group())

greedyHaRegex = re.compile(r'(Ha){3,5}?')#非贪心匹配
mo1 = greedyHaRegex.search('HaHaHaHaHa')
print(mo1.group())

运行结果:

HaHaHaHaHa
HaHaHa
>>> 

注意:?问号在正则表达式中可能有两种意思:声明非贪心匹配或者表示可选分组,这两种含义完全无关。

二 findall()方法

除了search()方法外,Regex对象也有一个findall()方法。

search()返回一个Match对象,包含被查找字符串中的‘第一次’匹配文本。

findall()方法将返回一组字符串,包含被查找文本中所有匹配。

例子:

>>> phoneNum = re.compile(r'ddd-ddd-dddd')
>>> phoneNum.findall('Cell:400-820-8820 Work:400-820-8821')
['400-820-8820', '400-820-8821']

findall()返回的不是一个Match对象,而是返回一个字符串列表,只要在正则表达式中没有分组。

如果在正则表达式中进行了分组,那么findall()将返回元组的列表。每个元组表示一个找到的匹配,其中的项就是正则表达式中每个分组的匹配字符串。

例如:(请注意,被编译的正则表达式有分组)

>>> phoneNum = re.compile(r'(ddd)-(ddd)-(dddd)')
>>> phoneNum.findall('Cell:400-820-8820 Work:400-820-8821')
[('400', '820', '8820'), ('400', '820', '8821')]

记住分组和不分组的区别。

原文地址:https://www.cnblogs.com/BeautifulSoup/p/8407656.html