【问题标题】:Regex for wrapping digits with curly braces?正则表达式用花​​括号包裹数字?
【发布时间】:2011-09-29 11:29:26
【问题描述】:

我正在尝试使用 Python 的 re.sub() 来匹配带有 e 字符的字符串,并在 e 字符和最后一个数字之后立即插入花括号。例如:

12.34e56 to 12.34e{56}
1e10 to 1e{10}

我似乎找不到正确的正则表达式来插入所需的花括号。例如,我可以像这样正确插入左大括号:

>>> import re
>>> x = '12.34e10'
>>> pattern = re.compile(r'(e)')
>>> sub = z = re.sub(pattern, "\1e{", x)
>>> print(sub)
    12.34e{10 # this is the correct placement for the left brace

我的问题出现在使用两个反向引用时。

>>> import re
>>> x = '12.34e10'
>>> pattern = re.compile(r'(e).+($)')
>>> sub = z = re.sub(pattern, "\1e{\2}", x)
>>> print(sub)
    12.34e{} # this is not what I want, digits 10 have been removed

谁能指出我的问题?感谢您的帮助。

【问题讨论】:

    标签: python regex backreference


    【解决方案1】:
    re.sub(r'e(\d+)', r'e{\1}', '12.34e56')
    

    返回'12.34e{56}'

    或者,相同的结果但不同的逻辑(不要将e替换为e):

    re.sub(r'(?<=e)(\d+)', r'{\1}', '12.34e56')
    

    【讨论】:

    • 太棒了,感谢您的帮助。幕后技巧真的很酷。
    • 在第二个解决方案中,为什么使用r'{\1}' 而不是r'{\2}' 进行替换?我尝试使用r'{\2},但这导致了错误。后向引用不支持后视吗?
    • @dr.bunsen 正确,后视是非捕获组。
    【解决方案2】:

    您的大括号放置不正确。

    这是一个解决方案,确保在 e 之前有一个带有可选小数位的数字:

    import re
    samples = ['12.34e56','1e10']
    for s in samples:
      print re.sub(r'(\d+(?:\.\d+)?)e([0-9]+)',"\g<1>e{\g<2>}",s)
    

    产量:

    12.34e{56}
    1e{10}
    

    【讨论】:

    • 我认为将 eumiro 的第二个扩展为 r'(?&lt;=\de)(\d+)' 可能就足够了?
    • @agf:同意,这可能就足够了。
    猜你喜欢
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多