0

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

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

根据我指定的模式,它会删除多余的逗号和逗号前后的空格。但它丑得要命。任何有关如何简化它或至少使其更具可读性的建议将不胜感激。

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

非常感谢!

4

2 回答 2

1

这不是那么糟糕。由于搜索字符串中的逗号,它看起来更加混乱。

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

>>> 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
于 2013-10-23T00:01:00.093 回答
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()在生成器表达式的末尾使用 a 来实现相同的目的,但是将每个字符串剥离两次似乎很愚蠢)。最后,','.join调用将输出字符串放在一起,每个值之间有一个逗号。

于 2013-10-23T00:41:28.067 回答