分组
():把多个字符打包成一个子表达式,对【一整组内容】施加量词(重复次数) 之前的量词+ * ? {n}只能作用在单个字符/字符集上;加括号之后,量词作用于括号内全部内容。
1. 基础示例
(\d{1,3}\.){3}\d{1,3} — 简易IP正则
\d{1,3}:1~3位数字\d{1,3}\.:数字 + 点号(\d{1,3}\.)→ 打包成一个分组{3}:让这个分组整体重复 3 次 →shturl.cc/Q.- 最后再接
\d{1,3}→ 完整shturl.cc/Q.xxx
缺点:只校验格式,不校验数值范围,会匹配 666.777.888.999,而这不是合法IP。
2. 合法IP分段表达式
2[0-4]\d|25[0-5]|[01]?\d\d?
这是单个IP段(0~255),用分支 | 分成3种情况:
2[0-4]\d:200 ~ 249- 第一位固定2,第二位0~4,第三位任意数字
25[0-5]:250 ~ 255- 25开头,第三位0~5
[01]?\d\d?:0 ~ 199[01]?:可选0或1;后面最多两位数字。允许0、01、10、199,支持前导零。
把这个分段打包进分组,重复3次加小数点,最后再接一段:
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
(xxx\.){3}:合法IP段 + 点,整体重复3次- 最后一段不再带小数点
注意:这里外层还有一层括号,所以这是分组嵌套,分组可以嵌套使用。
3. 分组两大作用
1 给一组字符施加量词
例子:(boy){3}
(boy):分组,把boy打包{3}:整组重复3次 匹配:boyboyboy不会匹配boyboy、boyboyboyboy,也不会匹配booooy
对比:
boy{3},不加括号,量词只作用在yboy{3}=bo+yyy→ 匹配boyyy
2 捕获内容(捕获分组)
() 默认是捕获分组:不仅整体匹配,还会把括号里面匹配到的内容单独保存下来,后续可以提取。
比如提取
<div>hello</div>里面的 hello:<div>(.+?)</div>整个正则匹配<div>hello</div>,分组1单独捕获hello,爬虫、文本提取非常常用。
思考题
正则:(abc){2} 能匹配哪个字符串? 答案 abcabc
写正则匹配 ha 或者 haha 参考答案 (ha){1,2}