python 正则表达式

来源:互联网 发布:淘宝0信誉店铺出售 编辑:程序博客网 时间:2024/05/17 02:43

最近在做毕设,需要学习一下正则表达式

正则表达式的基本语法:


字符匹配.匹配任意字符(除了\n)[...]匹配字符集\d/\D匹配数字/非数字\s/\S匹配空白/非空白字符\w/\W匹配单词字符[a-zA-Z0-9]/非单词字符
字符匹配*匹配前一个字符0次或者无限次+匹配前一个字符1次或者无限次?匹配前一个字符0次或者1次{m}/{m,n}匹配前一个字符m次/至少m次,至多n次*?/+?/??匹配模式变成非贪婪(尽可能少匹配字符)

那么什么叫做非贪婪(尽可能少匹配字符)呢?
举个例子:
ma = re.match(r'[0-9][a-z]*','3abc') ma.group() #匹配结果为3abcma = re.match(r'[0-9][a-z]*?','3abc')ma.group() #匹配结果为3ma = re.match(r'[0-9][a-z]+?','3abc')ma.group() #匹配结果为3a


边界匹配:

字符匹配^匹配字符串开头$匹配字符串结尾\A/\Z指定的字符串必须出现在开头/结尾

分组匹配:

字符匹配匹配左右任意一个表达式(ab)括号中表达式作为一个分组(group)\number引用编号为number的分组匹配到的字符串(?P<name>)给分组取一个别名(?P=name)引用别名为name的分组匹配到的字符串

贪婪模式和非贪婪模式


如:String str="abcaxc";
    Patter p="ab*c";

贪婪匹配:
正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab*c)。

非贪婪匹配
就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab*c)。

贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。非贪婪模式只被部分NFA引擎所支持。

属于贪婪模式的量词,也叫做匹配优先量词,包括: “{m,n}”、“{m,}”、“?”、“”和“+”。 在一些使用NFA引擎的语言中,在匹配优先量词后加上“?”,即变成属于非贪婪模式的量词,也叫做忽略优先量词,包括: “{m,n}?”、“{m,}?”、“??”、“?”和“+?”。 从正则语法的角度来讲,被匹配优先量词修饰的子表达式使用的就是贪婪模式,如“(Expression)+”;被忽略优先量词修饰的子表达式使用的就是非贪婪模式,如“(Expression)+?”。

常用函数


re.compile(pattern,flag=0)
把一个正则表达式编译成一个正则表达式对象,可以用match()和search()来匹配

Compile a regular expression pattern into a regular expression object, which can be used for matching using its match() and search() methods

prog = re.compile(pattern)result = re.match(string)
等价于:
result = re.match(pattern,string)
但是用re.compile(),保存正则表达式对象,在重用的时候很有效,比如在一个程序中要多次用到的时候

but using re.compile() and saving the resulting regular expression object for reuse is more efficient when the expression will be used
several times in a single program.

这样一个个函数的解释也麻烦,就来一张表格吧

正则表达式模块的函数


语法描述re.compile(r,f)返回编译后的正则表达式r,如果指定,就将其标记设置为fre.escape(s)返回字符串s,其中所有非字母数字的字符都实用反斜线进行了转义处理。因此返回的字符串中没有特殊的正则表达式字符re.findall(r,s,f)返回正则表达式r在字符串s中所有非交叠的匹配(如果给定f,就受其制约)。如果表达式中有捕获,那么每次匹配都作为一个捕获元组返回re.finditer(r,s,f)对正则表达式r在字符串s中每个非交叠的匹配(如果给定f,就受其制约),都返回一个匹配对象re.match(r,s,f)如果正则表达式r在字符串s的起始处匹配(如果给定f,就受其制约),就返回一个匹配对象,否则返回Nonere.search(r,s,f)如果正则表达式r在字符串s任意处匹配(如果给定f,就受其制约),就返回一个匹配对象,否则返回Nonere.split(r,s,m)返回分割字符串s(在正则表达式r每次出现处进行分割)所产生的字符串的列表,至多分割m次(如果没有给定m,就分割尽可能多的次数),如果正则表达式中包含捕获,就被包含在被分割的部分之间re.sub(r,x,s,m)对正则表达式r的每次匹配(如果给定m,那么至多m次),返回字符串s的一个副本,并将其替换为x-这可以是一个字符串,也可以是一个函数re.subn(r,x,s,m)与re.sub()相同,区别在于此函数返回一个二元组,其中一项为生成的字符串,一项为代入的次数

正则表达式模块的标记


标记含义re.A or re.ASCII使\b,\B,\s,\S,\w和\W都假定字符串为ASCII,默认为这些字符类的速记法,依赖于Unicode规范re.I or re.IGNORECASE使正则表达式以大小写不敏感的方式进行匹配re.M or re.MULTILINE使 ^在起始处并在每个换行符后匹配,使$在结尾处但在每个换行符之前匹配re.S or re.DOTALL使.匹配每个字符,包括换行符re.X or re.VERBOSE使空白和注释包含在匹配中
原创粉丝点击