正则表达式:
Python中用来处理正则表达式的是re模块。
正则表达式使用的符号:
literal 匹配字符串值
re1|re2 匹配正则表达式re1或者re2
. 匹配任何字符(换行符除外)
^ 匹配字符串的开始
$ 匹配字符串的结尾
* 匹配0次或多次
+ 匹配1次或多次
? 匹配0次或1次
{N} 匹配N次
{M,N} 匹配M次到N次
[abcd] 匹配其中的任意一个字符
[a- b] 匹配从a到b中间的任意一个字符
[^abc] 不匹配其中的任意一个字符
(*|+|?|{})? 用于任何非贪婪版本重复匹配次数符号(*,+,?,{})
(re1) 匹配括号中的正则表达式,括号标识正则表达式组。
\d 匹配任何数字[0 – 9]
\D 匹配任何非数字
\w 匹配任何数字和字母[A-Za-z0-9]
\W \w的反义
\b 匹配单词边界
\B \b的反义
\nn 匹配已经保存的子组
\c 匹配特殊字符,将特殊字符按普通字符处理
\A 匹配字符串开始
\Z 匹配字符串结束
re模式常用的函数:
compile(<regex string>) #将正则表达式编译为正则表达式对象,可以重复使用而不用多次编译。
match(<regex>, <targetstrign>) #正则表达式是否匹配目标字符串,返回匹配对象。可以通过匹配对象的string等属性得到结果。
search(<regex>,<targetstring>)#找到第一个符合正则表达式的子串,返回匹配对象。
【匹配对象有 两个重要的方法:group() 和groups()】
findall(<regex>,<sourcestring>) #找到所有的匹配正则表达式的子串,返回列表对象。
finditer(<regex>,<sourcestring>)#找到所有的匹配正则表达式的子串,返回迭代对象。
sub(<regex>,<substring>,<source_string>)#匹配替换,用substing 替换在source string中找到的与正则表达式匹配的子串。
subn(): #功能与sub相同,但还返回一个替换次数。
split(<regex>,<sourcestring>)#以正则表达式为分隔符,对源字符串进行分割。
>>> re.split('\d','a3b3c3d5')
['a', 'b', 'c', 'd', '']
非贪婪匹配:? 将? 用于通配符* 或+后面时,通配符尽可能少的匹配字符。如下例:
源串:'Thu Feb 15 17:46:04 2007::uzifzf@dpyivihw.gov::1171590364-6-8'
模式:'\d+-\d+-\d+'
搜索: re.search(patt, data).group()
结果:'1171590364-6-8'
做匹配操作:
patt = '.+\d+-\d+-\d+'
re.match(patt, data).group()
如果只想获取末尾数字的字段:
patt = '.+(\d+-\d+-\d+)'
re.match(patt, data).group(1) # subgroup 1 #子组 1
'4-6-8'
预期结果应该是“1171590364-6-8”,而实际是“4-6-8”。原因是:正则表达式本身默认是贪心匹配的。顺序是左优先。
即正则表达式匹配默认返回满足条件的字符串中长度最长的字符串,模式中(.+)优先匹配到“Thu Feb 15 17:46:04 2007::uzifzf@dpyivihw.gov::117159036”,
后续的正则表达式继续与后续源字符串进行比对。导致上述结果。
Python的正则表达式提供了“非贪婪”操作符?该操作符表示返回符合正则表达式的最短的字符串。
patt = '.+?(\d+-\d+-\d+)'
re.match(patt, data).group(1) # subgroup 1 # 子组 1
'1171590364-6-8'