如何解释字符串中的数字列表?

时间:2015-06-02 09:50:17

标签: python regex

我的数字值如下:

<bean id="activemq" 
  class="org.apache.activemq.camel.component.ActiveMQComponent">
  <property name="concurrentConsumers" value="1"/>
  <property name="transacted" value="true"/>
</bean>

我想将它们变成完全明确的数字列表,如下所示:

a="1-5"
b="1,3"
c="1"
d="1,3-5"
e="1-3,5,7-8"
f="0,2-5,7-8,10,14-18"

使用a="1,2,3,4,5" b="1,3" c="1" d="1,3,4,5" e="1,2,3,5,7,8" f="0,2,3,4,5,7,8,10,14,15,16,17,18" 模块,我可以得到数字:

re

中的1 5相同

但我无法获得全方位的数字

即。 a

中的1 2 3 4 5

我该怎么做?

3 个答案:

答案 0 :(得分:4)

我认为没有必要在这里使用正则表达式:

def expand_ranges(string):
    def expand(start, stop):
        return ','.join(map(str, range(int(start), int(stop) + 1)))
    return ','.join([expand(*d.split('-')) if '-' in d else d for d in string.split(',')])

  1. 将逗号分隔输入字符串。
  2. 如果字符串中有短划线,则在该短划线上拆分并展开范围以包含插入的数字
  3. 用逗号加入结果。
  4. 每个测试用例的演示:

    >>> expand_ranges("1-5")
    '1,2,3,4,5'
    >>> expand_ranges("1,3")
    '1,3'
    >>> expand_ranges("1")
    '1'
    >>> expand_ranges("1,3-5")
    '1,3,4,5'
    >>> expand_ranges("1-3,5,7-8")
    '1,2,3,5,7,8'
    >>> expand_ranges("0,2-5,7-8,10,14-18")
    '0,2,3,4,5,7,8,10,14,15,16,17,18'
    

答案 1 :(得分:2)

如果您设置了正则表达式,则可以将自定义函数作为repl参数传递给re.sub

>>> import re
>>> def replacer(match):
    start, stop = map(int, match.groups())
    return ','.join(map(str, range(start, stop+1)))

>>> re.sub('(\d+)-(\d+)', replacer, '1-3,5,7-8')
'1,2,3,5,7,8'

答案 2 :(得分:0)

你必须以特殊的方式对待范围(1&#34; - &#34; 5)。尝试内置的蟒蛇&#34; range&#34;为此。

祝你好运。