【问题标题】:Add [] around numbers in strings在字符串中的数字周围添加 []
【发布时间】:2015-09-19 08:05:50
【问题描述】:

我喜欢在字符串中的任何数字序列周围添加 [],例如

"pixel1blue pin10off output2high foo9182bar"

应该转换为

"pixel[1]blue pin[10]off output[2]high foo[9182]bar"

我觉得一定有一个简单的方法,但它让我无法理解:(

【问题讨论】:

    标签: python regex python-2.7


    【解决方案1】:

    是的,有一个简单的方法,使用re.sub():

    result = re.sub(r'(\d+)', r'[\1]', inputstring)
    

    这里\d 匹配一个数字,\d+ 匹配一个或多个数字。该模式周围的(...) 对匹配进行分组,因此我们可以在第二个参数(替换模式)中引用它。该模式只是将组周围的匹配数字替换为[...]。

    请注意,我使用了r'..' 原始字符串文字;如果不这样做,则必须将所有 \ 反斜杠加倍;请参阅 Python Regex HOWTO 的 Backslash Plague section。

    演示:

    >>> import re
    >>> inputstring = "pixel1blue pin10off output2high foo9182bar"
    >>> re.sub(r'(\d+)', r'[\1]', inputstring)
    'pixel[1]blue pin[10]off output[2]high foo[9182]bar'
    

    【讨论】:

    • 很好,但是为什么这不会产生“... pin[1][0]off ... foo[9][1][8][2]bar”?
    • @SimpleSi: 因为\d+ 匹配尽可能多的数字;这称为 greedy 匹配。如果您使用\d+?,它将尽可能少地匹配,或非贪婪匹配。
    • 我会进一步阅读 - 我以前使用 \d{1,} 来查找所有数字 - 这是否与 \d+ 一样有效?
    • 是的,{1,} 与使用+ 的效果相同。
    【解决方案2】:

    你可以使用re.sub:

    >>> s="pixel1blue pin10off output2high foo9182bar"
    >>> import re
    >>> re.sub(r'(\d+)',r'[\1]',s)
    'pixel[1]blue pin[10]off output[2]high foo[9182]bar
    

    这里(\d+) 将匹配任何数字组合,re.sub 函数将用括号r'[\1]' 内的第一个组匹配替换它。

    你可以从这里开始学习正则表达式http://www.regular-expressions.info/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 2022-06-23
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多