修复 csv 引号的正则表达式
regex to fix csv quotes
我有一个带引号的简单 csv,例如:
"something","something","something","something",...
但是,有时我会用
得到 csv
"something","som"ething"","s"omething",...
我想创建一个正则表达式来解决这个问题,有人可以提供一些东西吗?
一些东西会从字符串中取出所有不是数字或文本的东西,但是当我取出时 "
我需要确保它不是限制字符串的东西因为我需要那些..
所以来自 "som"ething"","s"ometh8 ing"
id expect => "something","someth8 ing"
我正在使用 Scala,但任何解决方案都很棒!
谢谢!!
简单的解决方案
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}])|.""", "")
res17: String = "something","someth8 ing"
这会尝试在输入的开头或结尾处匹配 "
或 ","
任何其他位置或您批准的任何字符。如果其中任何一个匹配,它将转到第一个捕获组。否则,它匹配任何字符 (.
),但不会将其捕获到组中,因此第一组保持为空。然后将匹配到的子串替换为
,即第一个捕获组的内容
我仍然认为第一个解决方案更简洁、更容易理解。
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
中包含字符串的最后部分
我有一个带引号的简单 csv,例如:
"something","something","something","something",...
但是,有时我会用
得到 csv"something","som"ething"","s"omething",...
我想创建一个正则表达式来解决这个问题,有人可以提供一些东西吗?
一些东西会从字符串中取出所有不是数字或文本的东西,但是当我取出时 "
我需要确保它不是限制字符串的东西因为我需要那些..
所以来自 "som"ething"","s"ometh8 ing"
id expect => "something","someth8 ing"
我正在使用 Scala,但任何解决方案都很棒!
谢谢!!
简单的解决方案
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}])|.""", "")
res17: String = "something","someth8 ing"
这会尝试在输入的开头或结尾处匹配 "
或 ","
任何其他位置或您批准的任何字符。如果其中任何一个匹配,它将转到第一个捕获组。否则,它匹配任何字符 (.
),但不会将其捕获到组中,因此第一组保持为空。然后将匹配到的子串替换为,即第一个捕获组的内容
我仍然认为第一个解决方案更简洁、更容易理解。
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
中包含字符串的最后部分