免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: rockyaow
打印 上一主题 下一主题

python re 有没有 php里 preg_replace 这样的函数 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-12-19 11:09 |只看该作者
楼上的观点部分不认同~ 我给的那3段代码其实并不复杂,只是考验对api的熟练而已,所有用到的方法都有文档可查,如果不熟悉api又不想查文档,我觉得这种心态似乎不好。
当然,我给的前两个方法确实有偷懒之处,作为工具用用这么写是没问题的,项目开发时应该写成这样:
  1. d = dict(zip(a, b)) # dict.__init__, __builtin__.zip

  2. # method1
  3. import re
  4. def repr(m):
  5.     c = m.group()
  6.     return d.get(c, c) # dict.get
  7. print re.sub('.', repr, s) # re.sub

  8. # method2
  9. print ''.join(d.get(c, c) for c in s) # str.join, dict.get, list comprehension
复制代码
而第三个方法完全不需要做任何修改,本身就是几个方法的调用而已,这个实在不能说是理解不了,最多是用到的方法不熟悉。

论坛徽章:
0
12 [报告]
发表于 2010-12-20 16:41 |只看该作者
大家都迷上了使用一行的代码来解决问题,看起来又复杂又酷,这些代码如果让新人看到得琢磨一阵子了
a515200 发表于 2010-12-18 20:42



    呵呵,我是最反对写这样程序的. 有时候为了思路清晰,宁愿写上10多行代码, 而不是一行有难看懂又不好移植.

论坛徽章:
0
13 [报告]
发表于 2010-12-20 18:35 |只看该作者
回复 7# a515200


    我是想说遍历字符串,这样只能一个一个字符的走。另外字典里很长的RE做KEY的话,不知道会不会产生问题,我没实验过倒是。

论坛徽章:
0
14 [报告]
发表于 2010-12-20 18:41 |只看该作者
之所以使用字典是正好可以来解决像你那样的小问题,当要替换的值过多,字典key太多而影响效率的时候,自然得使用正则,这样做避免了杀鸡用牛刀

论坛徽章:
0
15 [报告]
发表于 2010-12-20 18:47 |只看该作者
本帖最后由 a515200 于 2010-12-20 18:49 编辑

以后如果有人问你"C语言"怎么实现排序,你就跟他说调用一下python的sort方法

论坛徽章:
0
16 [报告]
发表于 2010-12-22 10:08 |只看该作者
回复 15# a515200


    我很好奇你编辑前是什么回复~
无奈摊手,你不如举例说有人问怎么去美国,我说调Python方法好了。
楼主标题是“python re 有没有 php里 preg_replace 这样的函数”,不是说逻辑上不知道怎么处理,只是想方便一点而已,我也就是告诉他Python有相应的库可以调,我觉得没有什么问题。我也注意到你给的答案一样用到了库的一部分。如果楼主问的是怎么实现这样一个函数,我给的答案自然不会调已有的库。
另外,如果不知道dict查找key的时间复杂度,不妨去查查看。

论坛徽章:
0
17 [报告]
发表于 2010-12-22 10:14 |只看该作者
to楼主,你这个需求只能用正则解决。Python中据我目前所知没有可用的函数。
  1. import re

  2. s = 'hello python!'
  3. la = ['python', 'hello']
  4. lb = ['php', 'world']

  5. dct = dict(zip(la, lb))

  6. def repr(m):
  7.     return dct[m.group()]

  8. lc = map(re.escape, la)
  9. regex = '|'.join(lc)

  10. print re.sub(regex, repr, s)

  11. # 纯炫耀
  12. print re.sub('|'.join(map(re.escape, la)), lambda m: dict(zip(la, lb))[m.group()], s)
复制代码

论坛徽章:
0
18 [报告]
发表于 2010-12-22 10:16 |只看该作者
本帖最后由 ixuh 于 2010-12-22 10:30 编辑

编辑掉。

论坛徽章:
0
19 [报告]
发表于 2010-12-23 15:03 |只看该作者
回复 17# ixuh


    我的疑问主要就剩下字典的键,能不能是正则字符窜,比a='(^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$)' 。
    假如我要想把特定的某些IP格式变一变,这样就很方便了。等我有时间了试试

论坛徽章:
0
20 [报告]
发表于 2010-12-23 23:00 |只看该作者
本帖最后由 a515200 于 2010-12-23 23:04 编辑

让我满足你的好奇心,我编辑前的回复    →   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP