最近在做毕设,需要学习一下正则表达式
正则表达式的基本语法:
字符 | 匹配 |
---|---|
. | 匹配任意字符(除了\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() #匹配结果为3abc ma = re.match(r'[0-9][a-z]*?','3abc') ma.group() #匹配结果为3 ma = re.match(r'[0-9][a-z]+?','3abc') ma.group() #匹配结果为3a
边界匹配:
字符 | 匹配 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\A/\Z | 指定的字符串必须出现在开头/结尾 |
分组匹配:
字符 | 匹配 | |
---|---|---|
匹配左右任意一个表达式 | ||
(ab) | 括号中表达式作为一个分组(group) | |
\number | 引用编号为number的分组匹配到的字符串 | |
(?P |
给分组取一个别名 | |
(?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,如果指定,就将其标记设置为f |
re.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,就受其制约),就返回一个匹配对象,否则返回None |
re.search(r,s,f) | 如果正则表达式r在字符串s任意处匹配(如果给定f,就受其制约),就返回一个匹配对象,否则返回None |
re.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 | 使空白和注释包含在匹配中 |