python中pos的⽤法_Python正则式的基本⽤法
Python正则式的基本⽤法
1.1基本规则
1.2重复
1.2.1最⼩匹配与精确匹配
1.3前向界定与后向界定
1.4组的基本知识
2.re模块的基本函数
2.1使⽤compile加速
2.2 match和search
2.3 finditer
2.4字符串的修改与替换
3.更深⼊的了解re的组与对象
3.1编译后的Pattern对象
3.2组与Match对象
3.2.1组的名字与序号
3.2.2Match对象的⽅法
4.更多的资料
初学Python,对Python的⽂字处理能⼒有很深的印象,除了str对象⾃带的⼀些⽅法外,就是正则表达式这个强⼤的模块了。但是对于初学者来说,要⽤好这个功能还是有点难度,我花了好长时间才摸出了点门道。由于我记性不好,很容易就忘事,所以还是写下来⽐较好⼀些,同时也可以加深印象,整理思路。
由于我是初学,所以肯定会有些错误,还望⾼⼿不吝赐教,指出我的错误。
1 Python正则式的基本⽤法
Python的正则表达式的模块是‘re’,它的基本语法规则就是指定⼀个字符序列,⽐如你要在⼀个字符串s=’123abc456’中查字符串’abc’,只要这样写:
>>> import re
>>> s='123abc456eabc789'
>>> re.findall(r’abc’,s)
结果就是:
['abc', 'abc']
这⾥⽤到的函数”findall(rule , target [,flag] )”是个⽐较直观的函数,就是在⽬标字符串中查符合规则的字符串。第⼀个参数是规则,第⼆个参数是⽬标字符串,后⾯还可以跟⼀个规则选项(选项功能将在compile函数的说明中详细说明)。返回结果结果是⼀个列表,中间存放的是符合规则的字符串。如果没有符合规则的字符串被到,就返回⼀个空列表。
为什么要⽤r’ ..‘字符串(raw字符串)?由于正则式的规则也是由⼀个字符串定义的,⽽在正则式中⼤量使⽤转义字符’\’,如果不⽤raw 字符串,则在需要写⼀个’\’的地⽅,你必须得写成’\\’,那么在要从⽬标字符串中匹配⼀个’\’的时候,你就得写上4个’\’成
为’\\\\’!这当然很⿇烦,也不直观,所以⼀般都使⽤r’’来定义规则字符串。当然,某些情况下,可能不⽤raw字符串⽐较好。
以上是个最简单的例⼦。当然实际中这么简单的⽤法⼏乎没有意义。为了实现复杂的规则查,re规定了若⼲语法规则。它们分为这么⼏类:
功能字符:‘.’ ‘*’ ‘+’ ‘|’ ‘?’ ‘^’ ‘$’ ‘\’等,它们有特殊的功能含义。特别是’\’字符,它是转义引导符号,跟在它后⾯的字符⼀般有特殊的含义。
规则分界符:‘[‘ ‘]’ ‘(’ ‘)’ ‘{‘ ‘}’等,也就是⼏种括号了。
预定义转义字符集:“\d”“\w” “\s”等等,它们是以字符’\’开头,后⾯接⼀个特定字符的形式,⽤来指⽰⼀个预定义好的含义。
其它特殊功能字符:’#’ ‘!’ ‘:’ ‘-‘等,它们只在特定的情况下表⽰特殊的含义,⽐如(?# …)就表⽰⼀个注释,⾥⾯的内容会被忽略。
下⾯来⼀个⼀个的说明这些规则的含义,不过说明的顺序并不是按照上⾯的顺序来的,⽽是我认为由浅⼊深,由基本到复杂的顺序来编排的。同时为了直观,在说明的过程中尽量多举些例⼦以⽅便理解。
1.1基本规则
‘[‘‘]’字符集合设定符
⾸先说明⼀下字符集合设定的⽅法。由⼀对⽅括号括起来的字符,表明⼀个字符集合,能够匹配包含在其中的任意⼀个字符。⽐如
[abc123],表明字符’a’ ‘b’ ‘c’ ‘1’ ‘2’ ‘3’都符合它的要求。可以被匹配。
在’[‘ ‘]’中还可以通过’-‘减号来指定⼀个字符集合的范围,⽐如可以⽤[a-zA-Z]来指定所以英⽂字母的⼤⼩写,因为英⽂字母是按照从⼩到⼤的顺序来排的。你不可以把⼤⼩的顺序颠倒了,⽐如写成[z-a]就不对了。
如果在’[‘ ‘]’⾥⾯的开头写⼀个‘^’号,则表⽰取⾮,即在括号⾥的字符都不匹配。如[^a-zA-Z]表明不匹配所有英⽂字母。但是如果‘^’不在开头,则它就不再是表⽰取⾮,⽽表⽰其本⾝,如[a-z^A-Z]表明匹配所有的英⽂字母和字符’^’。
‘|’或规则
将两个规则并列起来,以‘|’连接,表⽰只要满⾜其中之⼀就可以匹配。⽐如
[a-zA-Z]|[0-9]表⽰满⾜数字或字母就可以匹配,这个规则等价于[a-zA-Z0-9]
注意:关于’|’要注意两点:
第⼀,它在’[‘ ‘]’之中不再表⽰或,⽽表⽰他本⾝的字符。如果要在’[‘ ‘]’外⾯表⽰⼀个’|’字符,必须⽤反斜杠引导,
即’\|’ ;
第⼆,它的有效范围是它两边的整条规则,⽐如‘dog|cat’匹配的是‘dog’和’cat’,⽽不是’g’和’c’。如果想限定它的有效范围,必需使⽤⼀个⽆捕获组‘(?: )’包起来。⽐如要匹配‘I have a dog’或’I have a cat’,需要写成r’I have a (?:dog|cat)’,⽽不能写成r’I have a dog|cat’
例
>>> s = ‘I have a dog , I have a cat’
>>> re.findall( r’I have a (?:dog|cat)’ , s )
['I have a dog', 'I have a cat']#正如我们所要的
下⾯再看看不⽤⽆捕获组会是什么后果:
>>> re.findall( r’I have a dog|cat’ , s )
['I have a dog', 'cat']#它将’I have a dog’和’cat’当成两个规则了
⾄于⽆捕获组的使⽤,后⾯将仔细说明。这⾥先跳过。
‘.’匹配所有字符
匹配除换⾏符’\n’外的所有字符。如果使⽤了’S’选项,匹配包括’\n’的所有字符。
>>> s=’123 \n456 \n789’
>>> findall(r‘.+’,s)
['123', '456', '789']
>>> re.findall(r‘.+’ , s , re.S)
['123\n456\n789']
‘^’和’$’匹配字符串开头和结尾
注意’^’不能在‘[ ]’中,否则含意就发⽣变化,具体请看上⾯的’[‘ ‘]’说明。在多⾏模式下,它们可以匹配每⼀⾏的⾏⾸和⾏尾。具体请看后⾯compile函数说明的’M’选项部分python正则表达式不包含
‘\d’匹配数字
这是⼀个以’\’开头的转义字符,’\d’表⽰匹配⼀个数字,即等价于[0-9]
‘\D’匹配⾮数字
这个是上⾯的反集,即匹配⼀个⾮数字的字符,等价于[^0-9]。注意它们的⼤⼩写。下⾯我们还将看到Python的正则规则中很多转义字符的⼤⼩写形式,代表互补的关系。这样很好记。
‘\w’匹配字母和数字
匹配所有的英⽂字母和数字,即等价于[a-zA-Z0-9]。
‘\W’匹配⾮英⽂字母和数字
即’\w’的补集,等价于[^a-zA-Z0-9]。
‘\s’匹配间隔符
即匹配空格符、制表符、回车符等表⽰分隔意义的字符,它等价于[ \t\r\n\f\v]。(注意最前⾯有个空格)
‘\S’匹配⾮间隔符
即间隔符的补集,等价于[^ \t\r\n\f\v]
‘\A’匹配字符串开头
匹配字符串的开头。它和’^’的区别是,’\A’只匹配整个字符串的开头,即使在’M’模式下,它也不会匹配其它⾏的很⾸。
‘\Z’匹配字符串结尾
匹配字符串的结尾。它和’$’的区别是,’\Z’只匹配整个字符串的结尾,即使在’M’模式下,它也不会匹配其它各⾏的⾏尾。
例:
>>> s= '12 34\n56 78\n90'
>>> re.findall( r'^\d+' , s , re.M )#匹配位于⾏⾸的数字
['12', '56', '90']
>>> re.findall( r’\A\d+’, s , re.M )#匹配位于字符串开头的数字
['12']
>>> re.findall( r'\d+$' , s , re.M )#匹配位于⾏尾的数字
['34', '78', '90']
>>> re.findall( r’\d+\Z’ , s , re.M )#匹配位于字符串尾的数字
‘\b’匹配单词边界
它匹配⼀个单词的边界,⽐如空格等,不过它是⼀个
‘0’长度字符,它匹配完的字符串不会包括那个分界的字符。⽽如果⽤’\s’来匹配的话,则匹配出的字符串中会包含那个分界符。
例:
>>> s ='abc abcde bc bcd'
>>> re.findall( r’\bbc\b’ , s )#匹配⼀个单独的单词‘bc’,⽽当它是其它单词的⼀部分的时候不匹配
['bc']#只到了那个单独的’bc’
>>> re.findall( r’\sbc\s’ , s )#匹配⼀个单独的单词‘bc’
[' bc ']#只到那个单独的’bc’,不过注意前后有两个空格,可能有点看不清楚
‘\B’匹配⾮边界
和’\b’相反,它只匹配⾮边界的字符。它同样是个0长度字符。
接上例:
>>> re.findall( r’\Bbc\w+’ , s )#匹配包含’bc’但不以’bc’为开头的单词
['bcde']#成功匹配了’abcde’中的’bcde’,⽽没有匹配’bcd’
‘(?:)’⽆捕获组
当你要将⼀部分规则作为⼀个整体对它进⾏某些操作,⽐如指定其重复次数时,你需要将这部分规则⽤’(?:’ ‘)’把它包围起来,⽽不能仅仅只⽤⼀对括号,那样将得到绝对出⼈意料的结果。
例:匹配字符串中重复的’ab’
>>> s=’ababab abbabb aabaab’
>>> re.findall( r’\b(?:ab)+\b’ , s )
['ababab']
如果仅使⽤⼀对括号,看看会是什么结果:
>>> re.findall( r’\b(ab)+\b’ , s )
['ab']
这是因为如果只使⽤⼀对括号,那么这就成为了⼀个组(group)。组的使⽤⽐较复杂,将在后⾯详细讲解。
‘(?# )’注释
Python允许你在正则表达式中写⼊注释,在’(?#’ ‘)’之间的内容将被忽略。
(?iLmsux)编译选项指定
Python的正则式可以指定⼀些选项,这个选项可以写在findall或compile的参数中,也可以写在正则式⾥,成为正则式的⼀部分。这在某些情况下会便利⼀些。具体的选项含义请看后⾯的compile函数的说明。
请注意它们的⼤⼩写。在使⽤时可以只指定⼀部分,⽐如只指定忽略⼤⼩写,可写为‘(?i)’,要同时忽略⼤⼩写并使⽤多⾏模式,可以写为‘(?im)’。
另外要注意选项的有效范围是整条规则,即写在规则的任何地⽅,选项都会对全部整条正则式有效。
1.2重复
正则式需要匹配不定长的字符串,那就⼀定需要表⽰重复的指⽰符。Python的正则式表⽰重复的功能很丰富灵活。重复规则的⼀般的形式是在⼀条字符规则后⾯紧跟⼀个表⽰重复次数的规则,已表明需要重复前⾯的规则⼀定的次数。重复规则有:
‘*’0或多次匹配
表⽰匹配前⾯的规则0次或多次。
‘+’1次或多次匹配
表⽰匹配前⾯的规则⾄少1次,可以多次匹配
例:匹配以下字符串中的前⼀部分是字母,后⼀部分是数字或没有的变量名字
>>> s = ‘ aaa bbb111 cc22cc 33dd ‘
>>> re.findall( r’\b[a-z]+\d*\b’ , s )#必须⾄少1个字母开头,以连续数字结尾或没有数字
['aaa', 'bbb111']
注意上例中规则前后加了表⽰单词边界的’\b’指⽰符,如果不加的话结果就会变成:
>>> re.findall( r’[a-z]+\d*’ , s )
['aaa', 'bbb111', 'cc22', 'cc', 'dd']#把单词给拆开了
⼤多数情况下这不是我们期望的结果。
‘?’0或1次匹配
只匹配前⾯的规则0次或1次。
例,匹配⼀个数字,这个数字可以是⼀个整数,也可以是⼀个科学计数法记录的数字,⽐如123和10e3都是正确的数字。
>>> s = ‘ 123 10e3 20e4e4 30ee5 ‘
>>> re.findall( r’ \b\d+[eE]?\d*\b’ , s )
['123', '10e3']
它正确匹配了123和10e3,正是我们期望的。注意前后的’\b’的使⽤,否则将得到不期望的结果。
1.2.1精确匹配和最⼩匹配
Python正则式还可以精确指定匹配的次数。指定的⽅式是
‘{m}’精确匹配m次
‘{m,n}’匹配最少m次,最多n次。(n>m)
如果你只想指定⼀个最少次数或只指定⼀个最多次数,你可以把另外⼀个参数空起来。⽐如你想指定最少3次,可以写成{3,}(注意那个逗号),同样如果只想指定最⼤为5次,可以写成{,5},也可以写成{0,5}。
例寻下⾯字符串中
a:3位数
b: 2位数到4位数
c: 5位数以上的数
d: 4位数以下的数
>>> s= ‘ 1 22 333 4444 55555 666666 ‘
>>> re.findall( r’\b\d{3}\b’ , s )# a:3位数
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论