正则表达式来修复CSV报价

问题描述:

我有引号,像一个简单的CSV:正则表达式来修复CSV报价

“东西”, “东西”, “东西”, “东西”,...

但有时我得到的CSV

“东西”, “SOM” ething “”, “S” omething”,...

,我想创建一个正则表达式来解决这个问题,有人有东西可以提供吗?

的东西,将拿出所有的东西从不是一个数字或文本字符串,但是当我拿出"我需要因为我需要这些,使限界字符串确定它不是那些..

所以从"som"ething"","s"ometh8 ing" ID期望=>"something","someth8 ing"

即时通讯使用scala,但任何解决方案将是伟大的!

谢谢!!

+1

您可以使用''“+ x.replace('” ','')+'“''对于每个值 –

+1

是否有任何特定的原因要使用正则表达式?字符串替换会简单得多。 – duncan

+0

正确转义引号怎么样,例如'”a“”b ”, “CD”' –

简单的解决方案

Scala中的一个简单的解决方案:

scala> val input = """"som"ething"","s"ometh8 ing"""" 
input: String = "som"ething"","s"ometh8 ing" 

scala> val values = input.split("\",\"").map(_.filter(c => c.isLetterOrDigit || c.isWhitespace)) 
values: Array[String] = Array(something, someth8 ing) 

scala> val output = values.mkString("\"", "\",\"", "\"") 
output: String = "something","someth8 ing" 

假设你从来没有","你的价值观里,但如果你那么有没有办法解决您的CSV明确反正。

这不是最优化的解决方案速度或记忆方式,但它很简单。

编辑:正则表达式的解决方案

如果你真的想一些正则表达式,可享受:

scala> input.replaceAll("""(^"|"$|","|[\p{IsAlphabetic}\p{Digit}\p{Space}])|.""", "$1") 
res17: String = "something","someth8 ing" 

这种尝试匹配开头"或输入的结束或","其他任何地方或任何你批准字符。如果其中任何一个匹配,它会转到第一个捕获组。否则,它会匹配任何字符(.),但不会将其捕获到一个组中,因此第一组保留为空。然后,将匹配的子字符串替换为$1,这是第一个捕获组的内容。

我仍然认为第一个解决方案更清晰,更易于理解。

import re 
csv_string = '"something","som"ething"","s"omething"' 
for each_str in re.findall(r'(.*?)[\,\n]', csv_string): 
    print(re.sub(r'\"', '', each_str) 

添加一个换行符,在字符串的结尾,这样就可以包含字符串的re.findall最后一部分