多谢 主要我是不了解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)