我认为问题可能在于正则表达式模式匹配一个或子模式EN_EXTRACT_REGEX 和NUM_EXTRACT_REGEX 中的另一个,但不能同时匹配两者。 p>
当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 的正则表达式引擎的不同版本中。不幸的是,我无法提供差异的明确原因,但是,re.sub() 的版本 3.5 中有一个记录在案的更改关于不匹配组:
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
A B C D
a 1 b 2 c 3
aa__ bb__ 1122 cdef
_**_