免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1574 | 回复: 6
打印 上一主题 下一主题

求助个re.sub的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-08 17:49 |只看该作者 |倒序浏览
有个字符串是ABCDEFG,想变成ABC123DEFG
请问我这么替换为啥不对,这个“J3”是怎么来的,主要想练习re的用法
  1. >>> test
  2. 'ABCDEFG'
  3. >>> re.sub(r'^(.*C)(.*)$', r'\1123\2', test)
  4. 'J3DEFG'
复制代码

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
2 [报告]
发表于 2013-06-08 18:22 |只看该作者
回复 1# good_luck_68
  1. >>> test = 'ABCDEFG'
  2. >>> import re
  3. >>> re.sub('C','C123',test)
  4. 'ABC123DEFG'
  5. >>>
复制代码
不要把简单问题复杂化了。

论坛徽章:
0
3 [报告]
发表于 2013-06-09 09:45 |只看该作者
回复 2# ssfjhh


谢谢您的答案,我知道想完成这个需求方法有很多。我主要是想弄清楚这块的错误原因是什么

另外如果需求变为任意字符串,在第三个字符后面插入ABC,用正则的方式还是碰到这种情况,求解答

  1. >>> re.sub('(\w{3})', r'\1123', test)
  2. 'J3J3G'
  3. >>> re.match('(\w{3})', test).group(1)                                #这样能匹配到,可以验证正则表达式没有问题
  4. 'ABC'
复制代码

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
4 [报告]
发表于 2013-06-09 16:10 |只看该作者
本帖最后由 ssfjhh 于 2013-06-09 16:13 编辑

r'\1123'
python不知道你指的是哪个组,是\1还是\11还是\112,还是\1123,这并不明确,所以会出错。

如下面这个例子所示,123换成字母就不会出错了。
  1. >>> test = 'ABCDEFG'
  2. >>> import re
  3. >>> re.sub(r'^(?P<name>.*C)(.*), r'\1ZZZZ\2', test)
  4. 'ABCZZZZDEFG'
  5. >>>
复制代码
你还是想把捕捉到的组后面加几个数字字符怎么办?
有办法吗?
有!
把你要捕捉的组,命一个名,如下所示,将组命名为name,再次调用的时候就不用担心后面刚好是数字了。
  1. >>> test = 'ABCDEFG'
  2. >>> import re
  3. >>> re.sub(r'^(?P<name>.*C)(.*), r'\g<name>23\2', test)
  4. 'ABC23DEFG'
复制代码

论坛徽章:
0
5 [报告]
发表于 2013-06-14 18:37 |只看该作者
本帖最后由 wn0112 于 2013-06-14 18:37 编辑
  1. >>> test
  2. 'ABCDEFG'
  3. >>> re.sub(r'^(.*C)(.*)$', r'\g<1>123\g<2>', test)
  4. 'ABC123DEFG'
复制代码

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
6 [报告]
发表于 2013-06-17 12:16 |只看该作者
回复 1# good_luck_68
楼上已经提供多种解决办法了,主要留意下backreferences的用法,见Python文档
  1. \number
  2. Matches the contents of the group of the same number. Groups are numbered starting from 1. For example, (.+) \1 matches 'the the' or '55 55', but not 'the end' (note the space after the group). This special sequence can only be used to match one of the first 99 groups. If the first digit of number is 0, or number is 3 octal digits long, it will not be interpreted as a group match, but as the character with octal value number. Inside the '[' and ']' of a character class, all numeric escapes are treated as characters.
复制代码
\number的合法值为1~99,如果‘\’后有0或3个数字,则按照8进制字符串解释
  1. >>> '\112'
  2. 'J'
复制代码
因此会有你上面的”J3DEFG“

字符串操作简单直观最好,一般最后一招才是正则表达式,能用定长({})匹配就不用变长(*, +),推荐看下《OReilly.Mastering.Regular.Expressions.3rd.Edition》


   

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
7 [报告]
发表于 2013-06-17 14:13 |只看该作者
本帖最后由 ssfjhh 于 2013-06-17 14:15 编辑

回复 6# timespace


    读官方文档的程序员才是合格的程序员,受教了,又学了一招。

不过我对3位数字怎么被解释为8进制数字感兴趣,119怎么转成8进制?

话说,会有人确实会用到这么多组吗?有这么多组的时候竟然还不给组命名也不是好习惯。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP