首先说说原始字符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]+)吗不就实现了效果吗