>>> 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) |