我認爲這個問題可能是正則表達式模式匹配的子模式EN_EXTRACT_REGEX
和NUM_EXTRACT_REGEX
,但不能同時的一個或其他。
當re.sub()
與第一個模式中的字母字符相匹配時,它將嘗試替換第二個組參考\2
,因爲只有第一個組匹配 - 第二個組沒有匹配。
類似地,當數字模式匹配時,沒有\1
組進行替換,所以這也失敗了。
你可以看到,這是與該測試在Python 2的情況下:
>>> re.sub(AGGR_REGEX, r' \1', 'abcd') # reference first pattern
abcd
>>> re.sub(AGGR_REGEX, r' \2', 'abcd') # reference second pattern
Traceback (most recent call last):
....
sre_constants.error: unmatched group
的區別在於必須爲Python 2和Python 3的不同版本的正則表達式引擎的內部可惜我不能提供一個明確的理由不同,但是,有在3.5版本中關於無法比擬的一組記錄變化爲re.sub()
:
改變在3.5版本:無與倫比組與空字符串替換。
它解釋了爲什麼它在Python> = 3.5中工作,但不在早期版本中:基本忽略不匹配的組。
作爲一種變通方法,你可以改變你的模式來處理兩場比賽作爲一個組:
import re
EN_EXTRACT_REGEX = '[a-zA-Z]+'
NUM_EXTRACT_REGEX = '[0-9]+'
AGGR_REGEX = '(' + EN_EXTRACT_REGEX + '|' + NUM_EXTRACT_REGEX + ')'
# ([a-zA-Z]+|[0-9]+)
for s in '', '1234', 'abcd', 'a1b2c3', 'aa__bb__1122cdef', '_**_':
print(re.sub(AGGR_REGEX, r' \1', s))
輸出
1234
abcd
a 1 b 2 c 3
aa__ bb__ 1122 cdef
_**_
謝謝,這個效果很好的兩個版本。 :) –