RamseyZhen 2022-08-02 09:00 采纳率: 100%
浏览 41
已结题

学习 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. 希望能通过正则表达式实现匹配到 "汉字+英文数字" 的模式后在汉字和英文中间添加空格,应该如何实现呢?

再次感谢赐教。

  • 写回答

2条回答 默认 最新

  • 『Knight』 2022-08-02 11:42
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月13日
  • 已采纳回答 8月5日
  • 创建了问题 8月2日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效