数量词字符的描述到这里就结束,如果你仔细观察你会发现正则表达式abc*匹配abcc获取的结果是abcc而不是ab,表达式abc?匹配abc的结果是abc而不是ab,表达式abc{2,3}匹配abccc的结果不是abcc而是abccc。原因是正则表达式默认匹配方式是贪婪匹配,也就是最长匹配。所以会出现上述的匹配结果。那如果是想最短匹配呢?只需要在数量限定符后面加一个问号"?"就可以了。我们将上述的例子修改重新匹配下。实例如下:
>>> re.findall(r'abc*','abcc') #最长匹配
['abcc']
>>> re.findall(r'abc*?','abcc') #最短匹配
['ab']
>>> re.findall(r'abc?','abc')
['abc']
>>> re.findall(r'abc??','abc')
['ab']
>>> re.findall(r'abc{2,3}','abccc')
['abccc']
>>> re.findall(r'abc{2,3}?','abccc')
['abcc']
边界匹配
(1)^ 表示从字符串起始位置开始匹配。假设表达式为^abc,则匹配abcd,不匹配babc
>>> re.findall(r'^abc','abcd')
['abc']
>>> re.findall(r'^abc','babc')
[]
(2)$ 表示从字符串结尾开始匹配。假设表达式为abc$,则匹配ccabc,不匹配abcd
>>> re.findall(r'abc$','ccabc')
['abc']
>>> re.findall(r'abc$','ccabcd')
[]
(3)\A表示从 字符串起始位置开始匹配。 假设表达式为\Aabc,则匹配abcd,不匹配babc
>>> re.findall(r'\Aabc','abcd')
['abc']
>>> re.findall(r'\Aabc','babc')
[]
(4)\Z表示从字符串结束部分开始匹配。如果是存在换行,只匹配到换行前的结束字符串 假设表达式为abc\Z,则匹配abc,不匹配abcd
>>> re.findall(r'abc\Z','abc')
['abc']
>>> re.findall(r'abc\Z','abcd')
[]
(5)\b 表示匹配一个单词边界。假设表达式为'er\b' 则匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
>>> re.findall(r'er\b','never')
['er']
>>> re.findall(r'er\b','verb')
[]
(6)\B 表示匹配非单词边界。假设表达式为'er\B'则可以匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
>>> re.findall(r'er\B','verb')
['er']
>>> re.findall(r'er\B','never')
[]
逻辑分组
(1)| 表示匹配|左右表达式的任意一个。假设表达式为abc|def,则匹配abc、def
>>> re.findall(r'abc|def','abc')
['abc']
>>> re.findall(r'abc|def','def')
['def']
(2)(...) 作为分组,每遇到一个(,分组编号加1,使用分组的好处是匹配的子串会保存到一个子组,便于以后使用。假设表达式为(\d{4})-(\d{2})-(\d{2}),则用于匹配2017-06-03,然后用分组编号1、2、3分别获取年、月、日三个值。。说明:如果这里match()函数和match对象的group()函数理解有困难,可以先跳过,后面再返回查看。
>>> mat = re.search(r'(\d{4})-(\d{2})-(\d{2})','2017-06-03')
>>> mat.group()
'2017-06-03'
>>> mat.group(1)
'2017'
>>> mat.group(2)
'06'
>>> mat.group(3)
'03'
(3)(?P<name>...) 分组除原有编号外,再加一个别名 。假设表达式为(?P<Year>\d{4})-(?P<Month>\d{2})-(?P<Day>\d{2}),则匹配用于匹配2017-06-03,然后用命名分组名称Year、Month、Day获取年、月、日3个值。
>>> mat = re.search(r'(?P<Year>\d{4})-(?P<Month>\d{2})-(?P<Day>\d{2})','2017-06-03')
>>> mat.group()
'2017-06-03'
>>> mat.group('Year')
'2017'
>>> mat.group('Month')
'06'
>>> mat.group('Day')
'03'
当然,在分组有命名的情况下也依然可以使用默认分组编号获取年、月、日的值。结果如下:
>>> mat.group(1)
'2017'
>>> mat.group(2)
'06'
>>> mat.group(3)
'03'
(4)\<number> 引用编号为number的分组匹配到的字符串。假设表达式为 (abc)ee\1,则匹配abceeabc,不匹配abceeabd。