1. 程式人生 > >python 正則表示式 groups和group有什麼區別

python 正則表示式 groups和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)