python 正则表达式

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

正则表达式的基本语法:

字符匹配
.匹配任意字符(除了\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<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,如果指定,就将其标记设置为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使空白和注释包含在匹配中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值