V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zmrenwu
V2EX  ›  Python

Python re.sub() 的一个奇怪问题?

  •  
  •   zmrenwu · 2016-11-27 17:57:50 +08:00 · 1854 次点击
    这是一个创建于 2708 天前的主题,其中的信息可能已经有所发展或是发生改变。
    >>> def mark(mo):
                print(mo.group(1))
                return mo.group(1)
    
    >>> re.sub(r'@(yangxg)|@(zengshao)|@(zmrenwu)', mark, '@yangxg @zengshao @zmrenwu')
    yangxg
    None
    None
    

    原本的的意图去掉每个用户名前的 @ 符号,期望的输入应该是:yangxg zengshao zmrenwu

    但事实上对 @zengshao @zmrenwu Match 对象的 group(1) 为 None ?这是怎么回事?

    songkaiape
        1
    songkaiape  
       2016-11-28 10:00:31 +08:00
    不知道你为什么这么写。。 re.sub(r'@(\w+)', mark, '@yangxg @zengshao @zmrenwu') 这样不就可以了么。后面输出为 None 的原因是因为你三个之间是 3 选 1 吧,匹配其中一个就不会匹配后面的了。
    你可以看看下面这篇文章
    http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
    hanbaobao2005
        2
    hanbaobao2005  
       2016-11-28 12:41:21 +08:00
    如果这样呢?
    for i in ['@yangxg', '@zengshao', '@zmrenwu']:
    re.sub(r'@(yangxg|zengshao|zmrenwu)', mark, i)

    Python 会为每个() 分配 group, 你那种写法应该要判断 group(1), group(2), group(3)
    zmrenwu
        3
    zmrenwu  
    OP
       2016-11-28 16:46:04 +08:00
    @hanbaobao2005 谢谢,我错误理解了捕获组的含义,更正成这样就可以了: re.sub(r'@(yangxg|zengshao|zmrenwu)', mark, '@yangxg @zengshao @zmrenwu')
    zmrenwu
        4
    zmrenwu  
    OP
       2016-11-28 16:47:03 +08:00
    @songkaiape 嗯,你的是对的,只是因为我需要匹配特定的用户名,所以我把 (\w+) 改成了 (yangxg|zengshao|zmrenwu)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2909 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 14:42 · PVG 22:42 · LAX 07:42 · JFK 10:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.