正则表达式中小括号的用法

1,592 阅读2分钟

小括号()在正则表达式的应用中代表“捕获分组”

什么是捕获分组呢,在Python中string::match() 得出的结果中,会将正则表达式里()中匹配的结果单独存放在一个数组中,第一个()里的结果放在数组的第一位,第二个()里匹配的结果放在数组的第二位,以此类推。这样我们就能按照自己的需要得到自己最想要的结果了。

import re
mail = "123456@163.com"
pattern = "([\w]*)@([a-zA-Z0-9\.]*)"
print(re.search(pattern, mail).group(0,1,2))

image.png

在这个例子中,你就可以直接拿到邮箱中的邮箱账号和域名了。

  • (?:pattern) 表示非捕获分组 意思就是这个分组不做保存,是不想要的结果
import re
mail = "123456@163.com"
pattern = "(?:[\w]*)@([a-zA-Z0-9\.]*)"
print(re.search(pattern, mail).group(0,1))

得到的结果就只有域名"163.com" 了

  • (?=pattern) 表示正向肯定预查 就是匹配(?=pattern)中前面的结果,比如下面这个例子中,我只想要 "@163.com"前面的"123456"
var mail = "123456@qq.com,123456@163.com";
mail.match(/[\d]*(?=@163.com)/g);
  • (?!pattern) 表示正向否定预查 就是与上面那个相反,不匹配pattern的才是想要的结果
var a = "world.xml"; // warld.xls, word.doc, world.doc";
a.match(/[\w]*(?!.xls)/g);

则会剔除掉“warld.xls”这个

  • (?<=pattern) 表示反向肯定预查 就是匹配以(pattern)开头的结果

例如,"(?<=95|98|NT|2000)Windows"能匹配"2000Windows"中的"Windows",但不能匹配"3.1Windows"中的"Windows"。

  • (?<!pattern) 表示反向否定预查 反向否定预查,与正向否定预查类似,只是方向相反。例如"(?<!95|98|NT|2000)Windows"能匹配"3.1Windows"中的"Windows",但不能匹配"2000Windows"中的"Windows"。

下面举一个html中获取div background 图片地址的综合应用例子

在html中一个div的background设置为

.div-image{
    background: rgba(0, 0, 0, 0) url("http://127.0.0.1:5501/asset/parameteritem/btn_insert.png") no-repeat scroll 0% 0% / 100% 100% padding-box border-box;
}

我用JQuery想要取出url的地址,则可以使用

$(".div-image").css("background").match(/(?<=url\(\")[\S]*(?=\"\))/g);

取出的结果就是 “http://127.0.0.1:5501/asset/parameteritem/btn_insert.png” 了。