将字符串变成‘我要学Python编程’

将字符串变成‘我要学Python编程’

图文章节中

res = re.sub(r'\W+', '', s)是把 所有非字符数字下划线的 字符串替换成 空值

为什么中文保留下来了呢

原始代码

import re

s = "我我...我我...我要..要要...要要...学学学...学学..Python...编编编..编程..程.程...程...程"
res = re.sub(r'\W+', '', s)
ret = re.sub(r'(.)\1+', r'\1', res)
print(ret)
# 运行结果:
# 我要学Python编程

\1指的是前面 . 捕获的字符

那么(.)的括号是将 . 包裹起来而非组的概念。

这样r'(.)\1'前面的r作用就是避免转义

这么理解的话ret = re.sub(r'(.)\1+', r'\1', res)改成ret = re.sub(r'(\w)\1+', r'\1', res)
执行结果就不正确了才对,而实际执行结果却是正确的

修改代码:

import re

s = "我我...我我...我要..要要...要要...学学学...学学..Python...编编编..编程..程.程...程...程"
res = re.sub(r'\W+', '', s)
print(res)
ret = re.sub(r'(\w)\1+', r'\1', res)
print(ret)
# 运行结果:
# 我要学Python编程



正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学,你好!\W是非字母数字及下划线,可以将字符串中的点匹配出来,用re.sub将匹配出的点替换成空字符串,原来的汉字是不变的

https://img1.sycdn.imooc.com//climg/6476b08c09aa7b9b04920089.jpg

.是任意字符指s变量中任意字符,()是组的意思,\1+表示重复匹配正则中第一个圆括号内匹配到的内容,然后将\1匹配的内容进行原变量替换

祝学习愉快~

  • Mr朱_ 提问者 #1

    大写\W是非字母数字及下划线,可以匹配汉字的

    那么这段代码就将汉字替换成空字符了

    结果应该只输出  Python  才对呀,

    实际输出

    我我我我我要要要要要学学学学学Python编编编编程程程程程

    import re
     
    s = "我我...我我...我要..要要...要要...学学学...学学..Python...编编编..编程..程.程...程...程"
    res = re.sub(r'\W+', '', s)
    print(res)


    2023-05-31 10:49:10
  • 好帮手慕小猿 回复 提问者 Mr朱_ #2

    同学,你好!

    1、\W 匹配非字母数字下划线,会将点号匹配出来

    https://img1.sycdn.imooc.com//climg/6476c3130930229314840368.jpg


    re.sub(r'\W+', '', s) 对字符串的中点号替换成空字符

    https://img1.sycdn.imooc.com//climg/62b679ae093688fc09040274.jpg

    2、然后再将匹配到的一组重复字符,用一个字符替换

    https://img1.sycdn.imooc.com//climg/62b67acf093131a208970392.jpg

    祝:学习愉快!


    2023-05-31 11:47:43
  • Mr朱_ 提问者 回复 好帮手慕小猿 #3

    网上有解释说:\w匹配的是能组成单词的字符,在python3 中re默认支持的是unicode字符集,当然也支持汉字如果要让\w仅支持英文,加个re.A标志print(re.findall(r"\w",s,re.A))这样就不会匹配汉字了

    反过来\W就匹配不到汉字

    re.findall(r"\W",s)

    这样

    res = re.findall(r'\W+', s)

    才能只匹配到'.'

    2023-05-31 12:12:30
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星

相似问题

登录后可查看更多问答,登录/注册

请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师