Ato*_*pat 13 python regex python-2.7
我正在编写一个函数来从python中的文本中分割数字和其他一些东西.代码看起来像这样:
EN_EXTRACT_REGEX = '([a-zA-Z]+)'
NUM_EXTRACT_REGEX = '([0-9]+)'
AGGR_REGEX = EN_EXTRACT_REGEX + '|' + NUM_EXTRACT_REGEX
entry = re.sub(AGGR_REGEX, r' \1\2', entry)
Run Code Online (Sandbox Code Playgroud)
现在,这段代码在python3中工作得非常好,但它在python2下不起作用并得到" 无法匹配的组 "错误.
问题是,我需要支持这两个版本,我无法让它在python2中正常工作,尽管我尝试了其他各种方法.
我很好奇这个问题的根源是什么,是否有任何解决方法?
mha*_*wke 10
我认为这个问题可能是正则表达式模式匹配一个或另一个子模式的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
Run Code Online (Sandbox Code Playgroud)
不同之处在于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))
Run Code Online (Sandbox Code Playgroud)
产量
1234 abcd a 1 b 2 c 3 aa__ bb__ 1122 cdef _**_
| 归档时间: |
|
| 查看次数: |
780 次 |
| 最近记录: |