有关如何简化此正则表达式/替换/剥离操作的任何建议?

时间:2013-10-22 23:43:40

标签: python regex

这个代码位于for循环中,完成了我需要它做的事情:

string[i] = re.sub('^, |, $', '', string[i]).replace(', ,', ',').replace(',,', ',').rstrip(",")

根据我指定的模式,删除无关的逗号,以及逗号之前/之后的空格。但它很丑陋。任何有关如何简化它,或至少使其更具可读性的建议都将非常感激。

除了更优雅(如果可能)之外,我基本上希望做的与我在这行代码中所做的完全相同。

非常感谢!

2 个答案:

答案 0 :(得分:1)

坏。由于搜索字符串中的逗号,它看起来更令人困惑。

仅针对最后一部分,re.sub(r', ?,*', ',', string[i])将摆脱,,, ,,,,,,而不是开头和结尾的逗号......

>>> s = 'a,,,,b, ,c'
>>> re.sub(r', ?,*', ',', s)
'a,b,c'

嗯,如果你使用.strip(', ')代替.rstrip(),它会在开始和结束时删除所有逗号,所以......

 >>> s = ', a,,,,b, ,c, '
 >>> re.sub(r', ?,*', ',', s.strip(', ') )
 a,b,c

答案 1 :(得分:1)

如果我理解正确,你想要删除逗号旁边的所有空格,将任意数量的相邻逗号变成一个逗号,并删除字符串开头和结尾的逗号。

我怀疑你当前的代码并没有真正完成所有这些(尽管它可能对你的实际数据集有效)。

我是这样做的:

def clean_commas(text):
    return re.sub(r' *,[ ,]*', ',', text).strip(',')

正则表达式将空格和逗号(至少有一个逗号)的任意组合转换为单个逗号,周围没有空格。然后,strip调用会删除结果开头或结尾的所有逗号。

示例输出:

>>> clean_commas("a,,,,b")
'a,b'
>>> clean_commas(" , ,a, b,,  , ,,  ,c,d  e , f  ,, ,") # spaces internal to "d  e" kept
'a,b,c,d  e,f'

如果您愿意,甚至可以在没有任何正则表达式的情况下执行此操作:

def clean_commas(text):
    return ','.join(filter(None, (s.strip() for s in text.split(','))))

首先用逗号分隔输入文本(这可能会导致某些项为空字符串,或者只是空格的字符串)。然后,生成器表达式从每个字符串的开头和结尾剥离空白。然后filter(None, ...)调用跳过任何空的字符串(你可以在生成器表达式的末尾用if s.strip()实现相同的功能,但是将每个字符串剥离两次似乎很愚蠢)。最后,','.join调用将输出字符串放在一起,每个值之间只有一个逗号。