我的数字值如下:
<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
我该怎么做?
答案 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(',')])
此
每个测试用例的演示:
>>> 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;为此。
祝你好运。