正则表达式分组问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
ceclinux
帖子: 308
注册时间: 2013-01-17 2:42
系统: Ubuntu 12.04LTS

正则表达式分组问题

#1

帖子 ceclinux » 2013-09-26 21:40

问下,为什么正则表达式
(\d{1,3}\.){3}\d{1,3}
192.168.1.3
匹配
的分组情况是
图片
不懂分组匹配的是最后一个(1.),而不是192.或者168.
希望能讲下原理
Ubuntu 12.04 LTS
laptop:Acer 4750G CPU:I5-2410
内存:2+2G 硬盘:500+750
http://www.ceclinux.org
头像
oneleaf
论坛管理员
帖子: 10455
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

Re: 正则表达式分组问题

#2

帖子 oneleaf » 2013-09-26 22:03

(\d{1,3}\.){3}\d{1,3} =》 \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

这样明白了没?
头像
ceclinux
帖子: 308
注册时间: 2013-01-17 2:42
系统: Ubuntu 12.04LTS

Re: 正则表达式分组问题

#3

帖子 ceclinux » 2013-09-26 23:38

oneleaf 写了:(\d{1,3}\.){3}\d{1,3} =》 \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

这样明白了没?
一叶亲自回答 :em80
可能是我没讲清楚,这个正则我不懂的地方是分组的匹配,分组只匹配了{3}里面的最后一个,而非每个分组都匹配,这里不懂,谢谢了
Ubuntu 12.04 LTS
laptop:Acer 4750G CPU:I5-2410
内存:2+2G 硬盘:500+750
http://www.ceclinux.org
头像
oneleaf
论坛管理员
帖子: 10455
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

Re: 正则表达式分组问题

#4

帖子 oneleaf » 2013-09-27 9:30

正常啊,由于你只定义了一个分组,因此只反应出最后一个匹配的子字符串。

代码: 全选

>>> re.match(r'(\d{1,3}\.){3}\d{1,3}','192.168.2.5').groups()
('2.',)
>>> re.match(r'(\d{1,3}\.)(\d{1,3}\.)(\d{1,3}\.)\d{1,3}','192.168.2.5').groups()
('192.', '168.', '2.')
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 正则表达式分组问题

#5

帖子 eexpress » 2013-09-27 11:13

用{3}扩展以后,我也不清楚变成什么了。
你少用有歧义的正则就是。
通常如果要分段获取,肯定不会这样去写。
split 一次到数组就是。
● 鸣学
回复