Python学习笔记18

正则表达式:

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::[email protected]::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::[email protected]::117159036”,

后续的正则表达式继续与后续源字符串进行比对。导致上述结果。 

 Python的正则表达式提供了“非贪婪”操作符?该操作符表示返回符合正则表达式的最短的字符串。

patt = '.+?(\d+-\d+-\d+)' 
re.match(patt, data).group(1)  # subgroup 1      # 子组 1 
'1171590364-6-8' 






猜你喜欢

转载自blog.csdn.net/z54572/article/details/65442649
今日推荐