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

2016-11-27 17:57:50 +08:00
 zmrenwu
>>> 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 ?这是怎么回事?

2005 次点击
所在节点    Python
4 条回复
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
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
2016-11-28 16:46:04 +08:00
@hanbaobao2005 谢谢,我错误理解了捕获组的含义,更正成这样就可以了: re.sub(r'@(yangxg|zengshao|zmrenwu)', mark, '@yangxg @zengshao @zmrenwu')
zmrenwu
2016-11-28 16:47:03 +08:00
@songkaiape 嗯,你的是对的,只是因为我需要匹配特定的用户名,所以我把 (\w+) 改成了 (yangxg|zengshao|zmrenwu)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/323644

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX