当前位置: 首页 > 科技观察

每日一技能:正则表达式一个括号有两种含义

时间:2023-03-17 13:57:13 科技观察

在Python中,当我们想从一个正则表达式中提取部分内容时,我们可以将这部分内容用括号括起来。例如:要从字符串mypassword123456abc中提取123456abc,我们可以这样写一个正则表达式:importres='mypassword123456abc'password=re.findall('password(.*?)$',s)print(password)如下图所示:在这个例子中,括号的意思是“分组”。但是,在正则表达式中,括号还有另外一个意思,就是把几个符号放在一起作为一个整体。比如我的密码还有一串123456abc,其中password前面是密码。为了使用相同的正则表达式从这两个句子中提取密码,您需要表达password或password(.*?)$的含义。但是如果我们这样写:password|password(.*?)$其实就是password(.*?)$或者secretpassword(.*?)$。所以我们需要从整体上看(密码)和密码。这时,正则表达式本身就支持用中括号来表示:(password|password)(.*?)$在正则表达式中,|左右两边的多个字符串括号内会作为一个整体使用,这样就可以表示password(.*?)$或者password(.*?)$。但是,正则表达式中作为一个整体使用的括号与Python中用于分组的括号有冲突,所以我们会发现提取出来的内容并不是我们想要的:可以看到,这里,(password|password)有既有正则表达式整体的作用,又有Python中分组的作用。所以事实证明,还有更多我们不想要的东西。那么有没有办法让(password|password)整体只实现正则表达式的功能,而不实现Python中的分组功能呢?这时候就需要在正则表达式中使用组合符号?:。请比较以下三个结果:正如您所看到的,>.*?<和<(?:.*?)>具有相同的效果。这意味着以?:开头的括号失去了分组的功能。因此,我们在第一个例子中使用这个特性:>>>importre>>>s='mypassword123456abc'>>>re.findall('(?:password|password)(.*?)$',s)['123456abc']>>>s='我的密码123456abc'>>>re.findall('(?:password|password)(.*?)$',s)['123456abc']运行效果如图如下图,任务完成:本文转载自微信公众号“听不见的密码”,可通过以下二维码关注。转载本文请联系Code公众号。