学习 Python3 中正则表达式的一些疑惑。

在学习 Python3 中正则表达式时对于表达式前的 ’r' 的用法及替换规则产生了疑惑。
s = '汉字word'
s = re.sub('([\u4e00-\u9fa5]+)([0-9a-zA-Z]+)',r'\1',s)
print(s)
s = '汉字word'
s = re.sub('([\u4e00-\u9fa5]+)([0-9a-zA-Z]+)','\1',s)
print(s)
运行结果及报错内容
汉字

我的疑问如下:

  1. ‘r' 用来标记 rawstring,在 '\1'前加 ’r‘,难道不应该输出的结果是将匹配到的模式替换成 '\1'这个字符串吗?
  2. '\1' 是引用一次所获取的匹配,将匹配到的内容替换成本身,输出结果不应该是 '汉字word' 本身不变吗?对于以上两次输出的结果都很困惑,恳请不吝讲解。谢谢!
  3. 希望能通过正则表达式实现匹配到 "汉字+英文数字" 的模式后在汉字和英文中间添加空格,应该如何实现呢?

再次感谢赐教。

首先说说原始字符r的一些东西

print('\\n')  # \n
print(r'\n')  # \n
print('\n')  # \n

从上面的代码可以知道python官方定义了很多具有特殊功能的东西比如换行的时候“\n”那我们如何使他们失去这些特殊的功能呢,这个时候就用r"\n"解决使它成为字符串意义上的\n。
再来说说r在正则表达式里面的一些东西

mm = "c:\\a\\b\\c"
ret = re.match("c:\\\\", mm).group()  # c:\\
print(ret)  # print("c:\\")  所以最后输出c:\

ret = re.match("c:\\", mm).group()这行代码里面首先解释器看到了c:\\,我靠它就想""不是特殊字符----转义字符吗,如何两个\输出一个\吗所以最后拿去匹配的时候实际上是c:\,如何你保存为变量ret,接下来输出的时候也被去掉一个""最后输出c:\。而如果你换为一下这个代码

mm = "c:\\a\\b\\c"
ret = re.match(r"c:\\", mm).group()  # c:\\
print(ret)  # c:

你只需要r"c:\"里面c:\就得出来了一样的结果。因为解释器运行到这里的时候发现了r"",然后它就知道里面的东西不要当作特殊符号对待,而应该直接拿去匹配。
好了回归正传你的问题
对于你的第一个问题r"\1"解释器看到这个会认为\1不是特殊字符,那就直接拿去匹配所以“\1”完好无损的到了,然后匹配的时候不是说与第一个分组(也就是第一个括号匹配吗)所以代表这个([\u4e00-\u9fa5]+),然后sub的确是替换但是他是将s里面满足'([\u4e00-\u9fa5]+)([0-9a-zA-Z]+)'这部分的内容进行和\1替换,而\1分组的结果是([\u4e00-\u9fa5]+),所以最后不就是将'([\u4e00-\u9fa5]+)([0-9a-zA-Z]+)'替换成([\u4e00-\u9fa5]+)这个了吗,那最后的结果可不就是只有汉字吗?

import re
s = '汉字word'
s = re.sub(r'([\u4e00-\u9fa5]+)([\da-zA-Z]+)', r'\1 \2', s)
print(s)

这个是我写的可以满足你的需求的一个代码
输出:汉字 word
代码讲解:
匹配的时候分了两组,\1和\2分别对应([\u4e00-\u9fa5]+)和([\da-zA-Z]+)然后咱替换的时候用:\1+一个空格+\2不就相当于用([\u4e00-\u9fa5]+)空格([\da-zA-Z]+)去替换了([\u4e00-\u9fa5]+)和([\da-zA-Z]+)吗不就实现了效果吗

r表示此字符串里不使用转义符
r'\1'
等价于'\\1'
如果关于什么是转义符有疑问请自己查阅相关文献
你所有的疑问都源于对r的误解
还有,re.sub不是re.replace
你先查资料,看看re下面这几个函数都是干什么用的,再写程序
不要凭感觉,凭直觉,凭猜想,写完又问为什么跟自己预期的不一样