这段代码位于 for 循环中,可以完成我需要它做的事情:
string[i] = re.sub('^, |, $', '', string[i]).replace(', ,', ',').replace(',,', ',').rstrip(",")
根据我指定的模式,它会删除多余的逗号和逗号前后的空格。但它丑得要命。任何有关如何简化它或至少使其更具可读性的建议将不胜感激。
基本上希望做与我在这行代码中所做的完全相同的事情,除了更优雅(如果可能的话)。
非常感谢!
这不是那么糟糕。由于搜索字符串中的逗号,它看起来更加混乱。
对于最后一部分,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
如果我理解正确,您想消除与逗号相邻的所有空格,将任意数量的相邻逗号转换为单个逗号,并删除字符串开头和结尾的逗号。
我怀疑您当前的代码实际上并没有完美地完成所有这些(尽管它可能对您的实际数据集足够好)。
这是我的做法:
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
调用将输出字符串放在一起,每个值之间有一个逗号。