>>> 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 ?这是怎么回事?
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 |
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) |
3
zmrenwu OP @hanbaobao2005 谢谢,我错误理解了捕获组的含义,更正成这样就可以了: re.sub(r'@(yangxg|zengshao|zmrenwu)', mark, '@yangxg @zengshao @zmrenwu')
|
4
zmrenwu OP @songkaiape 嗯,你的是对的,只是因为我需要匹配特定的用户名,所以我把 (\w+) 改成了 (yangxg|zengshao|zmrenwu)
|