【问题标题】:Replacing consecutive symbol with number digit in python using regex使用正则表达式在python中用数字替换连续符号
【发布时间】:2016-03-01 04:12:20
【问题描述】:

情况是这样的:

str='myfile.#.#####-########.ext'

我想用数字替换 # :456 所以应该是:

str = 'myfile.456.00456-00000456.ext'

第二种情况:

str= 'myfile.%012d.tga'

将模式替换为数字 456,使其变为:

str= 'myfile.000000000456.tga'

我可以使用字符串替换方法来解决这个问题,方法是抓取模式然后计算数字然后用零填充填充。现在,我想知道如何在 python 中使用正则表达式?任何人都可以帮忙吗?非常感谢。

【问题讨论】:

  • regex101.com 。在那里玩正则表达式。这是一个很棒的网站。
  • 从替换的类型猜测,也需要一些编程。不太可能由正则表达式单独完成。
  • ##, ### 的情况如何?
  • @AvinashRaj:应该分别是045600456
  • @AvinashRaj :这就是我所期待的:如果使用 ## & ### 。它应该是 456 和 456。如果 #digit 小于数字,它将被忽略。如果 #digit 更高,那么它将用 '0' 填充标题 # 。所以#### 将是 0456。

标签: python regex


【解决方案1】:

第二种情况是直截了当的,不需要正则表达式,而正则表达式将是一种矫枉过正。我建议您使用字符串格式替换

'myfile.%012d.tga' % 456
Out[21]: 'myfile.000000000456.tga'

第一种情况很棘手,但可能

>>> def repl(m):
    return "{{0:0{}}}".format(len(m.group(1)))

>>> re.sub(r"(#+)", repl, st).format(456)
'myfile.456.00456-00000456.ext'

【讨论】:

  • 感谢它完美运行。顺便说一句,从您的代码中提取,我设法使用正则表达式找到答案进行多次替换。我已经发布了下面的代码。非常感谢。
【解决方案2】:

通过没有format函数的re.sub。

>>> s = 'myfile.#.#####-########.ext'
>>> re.sub(r'#+', lambda m: '456' if len(m.group()) == 1 else m.group()[:-1].replace('#', '0') + '456', s)
'myfile.456.0000456-0000000456.ext'

对于第二种情况,

>>> s = 'myfile.%012d.tga'
>>> re.sub(r'%(\d+)d', lambda m: str('0' * int(m.group(1)))[:-1] + '456', s)
'myfile.00000000000456.tga'

【讨论】:

    【解决方案3】:

    最后,感谢所有回答我问题的人。那个'lambda'东西给了我这个想法,这是我问题的答案:

    我第一个使用 '#' 的案例:

    s = 'myfile.##.####.########.ext'
    print re.sub('#+', lambda x : '456'.zfill(len(x.group())) ,s)
    
    ---> myfile.456.0456.00000456.ext
    

    我的第二个案例使用 %0xd 格式:

    s = 'myfile.%06d--%012d--%02d.ext'
    print re.sub('%0[0-9]+d', lambda x : x.group() % 456 ,s)
    
    r---> myfile.000456--000000000456--456.ext
    

    这只是上述两种情况的简单组合:

    s = 'myfile.##.####.########.%06d---%02d.ext'
    x=re.sub('#+', lambda x : '456'.zfill(len(x.group())) ,s)
    print re.sub('%0[0-9]+d', lambda x : x.group() % 456 ,x)
    
    ---> myfile.456.0456.00000456.000456---456.ext
    

    不要忘记“import re”来使用正则表达式。

    【讨论】:

      猜你喜欢
      • 2014-04-29
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多