python 正则表达式 groups和group有什么区别

为什么 
m = re.match("([abc])+", "abc")
print m.groups()
返回的只有('c',) 而不是 abc
而 print m.group() 就能返回整个的字符串
他们到底有什么区别呢 网上的解释我看的不是太明白
group和groups是两个不同的函数。

一般,m.group(N) 返回第N组括号匹配的字符。
而m.group() == m.group(0) == 所有匹配的字符,与括号无关,这个是API规定的。

m.groups() 返回所有括号匹配的字符,以tuple格式。
m.groups() == (m.group(0), m.group(1), ...)

对你给的例子:

m = re.match("([abc])+", "abc")
你的+号在括号外面。括号最多匹配到一个字符,要么是a, 要么是c,这个python引擎匹配的是末尾的c。
而m.group() == m.group(0) 这个返回的是整个匹配的字符串"abc".

关于捕获型括号在正则表达式里的用法,参见相关文档。
追问:
如果 m.groups() == (m.group(0), m.group(1), ...) 那么groups是不是应该输出(abc,a,b,c) 而且因为+不是可以匹配一个或者多个么? 所以是不是应该有 m.group(0), m.group(1),m.group(2), m.group(3)三个数据
追答:
m.group(2), m.group(3) 的意思是返回第2/3组括号匹配的字符串。
你看看你的表达式里面有几组括号?只有一组。所以在这个例子里面,这两个应该都是返回错误。
追问:
那我可以把正则表达式改为: 
    m = re.match("([abc])+\1", "abc")
    print m.group()
么, \1是否是输出第一组信息 我试了一下 好像不行 \1为什么不对,  为什么呢?
而且  既然m.group(1) 既然为c, 那么, groups是不是应该为(abc, c)呢?
追答:
>> 既然m.group(1) 既然为c, 那么, groups是不是应该为(abc, c)呢?

对不起。解释groups()的时候错了。应该是:
m.groups() == (m.group(1), m.group(2), ...)
不包括group(0)。可以阅读官方文档:
http://docs.python.org/2/library/re.html

就我个人而言,\N除了查找替换之外很少用。你可以说说你希望得到什么结果,我帮你写表达式。尽量避免使用\N。
追问:
多谢 主要我是不了解group和groups是怎么个操作方法 譬如如下的:
p = re.compile(r'[ ]+(\w+)+[ ]+')
    print p.search('Paris in the the spring spring ').group()
我觉得 group(1)是否应该返回的是spring, 如果按照您说的那样子的话,可是为什么返回的是in呢.
同理: 我找成对的字符串 p = re.compile(r'[ ]+(\w+)+[ ]+\1') 为什么返回的是 the 而不是spring, 它不是最后一个放到group呢? 再次感谢
追答:
p = re.compile(r'[ ]+(\w+)+[ ]+\1')
单个字符不需要[],可以简化为
p = re.compile(r' +(\w+)+ +\1')

(\w+)+这种写法效率很低,而且容易引起误会。表面上它匹配的是任意多个word(1个或更多),其实整体匹配的内容和一个word没区别,只是括号匹配的部分变得不清楚。
整体匹配上:(\w+)+ == \w+
括号匹配多少视engine而定,一般的语言实现应该都是(\w+)+ == (\w+)

如果要返回紧挨着的(空格分开)重复字串,我会这么做:
#!/usr/bin/env python
# coding=utf-8

import itertools

long_text = 'Paris in the the spring spring '

words = long_text.split()

repeats = [x for x, y in itertools.izip(words,
                                        itertools.islice(words, 1, None))
           if x == y]

==========================================
p = re.compile(r'[ ]+(\w+)+[ ]+')
等价于
p = re.compile(r' +(\w+) +')

这个匹配:N个空格,1个word,N个空格(N>=1)。
print p.search('Paris in the the spring spring ').group()
整个字符串里面,第一个能匹配到的是" in ",最后一个能匹配到的是" spring "。python的re module是找到一个匹配就停下来返回结果了,所以(\w+)就捕获到了"in",你也可以输出group(0),应该是匹配" in "。
其实别的语言的正则表达式引擎可以返回不同的结果。不见得一定返回第一个匹配项。

==========================================
正则表达式只是一个工具,而且不复杂。学习的时候可以从简单开始,不要人为把它复杂化。
尽量从实际需求出发设计正则表达式,不要为了使用表达式的某些功能设计表达式。

==========================================
如果要用正则表达式找重复单词,可以这么做:
import re
for mo in re.finditer(r'(\w+) +\1', long_text):
    print mo.group(0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值