设为首页 加入收藏

TOP

Python正则表达式与re模块介绍(二)
2019-05-23 14:33:46 】 浏览:187
Tags:Python 正则 表达式 模块 介绍
abc?','ab')
['ab']
>>> re.findall(r'abc?','abc')
['abc']


(4){m} 表示匹配前一个字符m次。假设表达式为abc{2},则匹配abcc,不匹配abc


>>> re.findall(r'abc{2}','abcc')
['abcc']
>>> re.findall(r'abc{2}','abc')
[]


(5){m,n} 表示匹配前一个字符m到n次。假设表达式为abc{2,3},则匹配abcc、abccc,不匹配abc


>>> re.findall(r'abc{2,3}','abcc')
['abcc']
>>> re.findall(r'abc{2,3}','abccc')
['abccc']
>>> re.findall(r'abc{2,3}','abc')
[]


数量词字符的描述到这里就结束,如果你仔细观察你会发现正则表达式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。


>>> re.match(r'(abc)ee\1','abceeabc') #match匹配则会有一个match对象返回。
<

首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C语言实现三个数从小到大排序/输出 下一篇Python调用外部系统命令

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目