2013-04-10 46 views
2

您好我想优雅地拓展型4-6的子串4,5,6在一个更大的串像展开某些子优雅较大的字符串中的python

s = "235:2,4,6-9,12,14-19;240:3,5-9,10;245:4,9,10-15,18" 

print expand(s) 
235:2,4,6,7,8,9,12,14,15,16,17,18,19;240:3,5,6,7,8,9,10;245:4,9,10,11,12,13,14,15,18 

使用Python。

有没有一些正则表达式伏都教或类似的呢?非常感谢!

+1

只是使用“”作为分隔符来字符串分割成阵列,然后通过元件的阵列进行迭代。如果将包含“ - ”提取两个数字并插入给定间隔的扩展版本。 – 2013-04-10 05:43:19

+0

@MartinV .:请注意,似乎有两种分隔符。 – georg 2013-04-10 06:58:56

回答

3

你可以这样做:

>>> import re 
>>> def repl(match): 
...  start, end = match.groups() 
...  return ','.join(str(i) for i in range(int(start), int(end)+1)) 
... 
>>> re.sub(r'(\d+)-(\d+)', repl, "235:2,4,6-9,12,14-19;240:3,5-9,10;245:4,9,10-15,18") 
'235:2,4,6,7,8,9,12,14,15,16,17,18,19;240:3,5,6,7,8,9,10;245:4,9,10,11,12,13,14,15,18' 

它使用的事实,repl参数re.sub可以是可调用的是把参数作为匹配,并返回替换字符串。然后

expand(s)功能将是:

import re 

def repl(match): 
    start, end = match.groups() 
    return ','.join(str(i) for i in range(int(start), int(end)+1)) 

def expand(s): 
    return re.sub('(\d+)-(\d+)', repl, s) 
+0

如果将括号放在模式的'd +'部分,然后使用'start,end = match.groups()',则可能简化函数。 – Blckknght 2013-04-10 05:50:01

+0

@Blckknght更新。谢谢。 – Bakuriu 2013-04-10 05:53:19

+0

@JanneKarila Ups!固定。 – Bakuriu 2013-04-10 08:45:44

相关问题