V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
stcasshern
V2EX  ›  问与答

正则匹配替换指定字符串部分内容,有没有快速方便的方法

  •  
  •   stcasshern · 2017-02-12 13:36:06 +08:00 · 2330 次点击
    这是一个创建于 2635 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如对于字符串"abc,xyz,abc,kkk,qwerty',想要替换 abc 之后的逗号,而不替换 xyz 之后的,最终变成'abcxyz,abckkk,qwerty' 目前的办法是用 pattern matcher 找到符合的字符串在一个个替换

    Pattern p = Pattern.compile("abc,");
    Matcher m = p.matcher(input);
    while(m.find()){
            input = input.replace(m.group(), m.group().replaceAll(",", ""));
    }
    

    但是正则不是有断言之类的吗,能不能直接用 String 类的 replace 达到这样的效果?

    4 条回复    2017-02-12 20:12:27 +08:00
    stcasshern
        1
    stcasshern  
    OP
       2017-02-12 13:47:24 +08:00
    搞定了,刚写错了= = 零宽后行断言就可以
    ifaii
        2
    ifaii  
       2017-02-12 15:40:57 +08:00
    >>> t = 'abc,xyz,abc,kkk,qwerty,dabc,123 abc,'
    >>> r = re.findall('^abc,|\Wabc,', t)
    >>> tt = t[:]
    >>> for x in r:
    t = t.replace(x, x[:-1])

    >>> tt
    'abc,xyz,abc,kkk,qwerty,dabc,123 abc,'
    >>> t
    'abcxyz,abckkk,qwerty,dabc123 abc'

    大概这种效果?
    stcasshern
        3
    stcasshern  
    OP
       2017-02-12 19:03:44 +08:00
    @ifaii 对,但是想一句话搞定,因为记得用断言是可以标记位置的= =不过没想起来能不能这么用
    DiamondbacK
        4
    DiamondbacK  
       2017-02-12 20:12:27 +08:00
    str = 'abc,xyz,abc,kkk,qwerty'
    re.sub(r'(?<=\babc),', '', str)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1755 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:31 · PVG 08:31 · LAX 17:31 · JFK 20:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.