3 回答

TA貢獻1784條經驗 獲得超7個贊
1) 從group的角度考慮,整個表達式應該寫作((..)+)。所以最高一層group(0)匹配整個字符串。
2) 先說第二個問題,按照文檔的描述的行為,group()是列出從編號1開始的所有group,而給定的表達式只有一個group,所以自然就是c3了
3) 好,最后是為什么group(1)是c3。如果你的正則表達式沒有那個“+”,那么它就只匹配a1。而有了“+”之后,每匹配到一個“(..)”就會放到group(1)中。所以跑完整個字符串,group(1)就存進了c3
我猜你其實想問“字符串中明明有三個符合(..)的,但為什么只出現了最后一個呢?”原因是,group說的是正則表達式中的括號,而不是字符串中符合括號內pattern的子串。

TA貢獻1824條經驗 獲得超6個贊
1.首先是match的問題.match是從開頭匹配,為什么會匹配到c3呢?
首先不考慮捕獲的問題,去掉捕獲的(?:..)+是匹配2個任意字符的多個子串,當然可以匹配到c3.
2.group(0)是整個匹配項,為什么groups()中沒有呢?
需要從表達式的解析說起,表達式的字面義上看只有一對括號,因此(..)+只有1個group(1)的捕獲組,每次捕獲都存在1號捕獲組。
而group(0)的實現是把歷史匹配過成功的字符串返回,與捕獲組無關:
>> m = re.match(r"(..)..(..)", "a1b2c3")
>> m.groups()
('a1', 'c3')
>> m.group(0)
'a1b2c3'
而groups的實現其實是group(1-99),因此group只支持到99個。因此groups也只有一個捕獲組的內容會給你:)
添加回答
舉報