【问题标题】:regex to fix csv quotes正则表达式修复 csv 引号
【发布时间】:2017-04-05 01:00:28
【问题描述】:

我有一个带引号的简单 csv,例如:

“某事”、“某事”、“某事”、“某事”、...

但是,有时我会用

获得 csv

“某事”、“某事”、“某事”、……

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

可以从字符串中取出所有不是数字或文本的东西,但是当我取出 " 时,我需要确保它不是限制字符串的东西,因为我需要那些..

所以来自"som"ething"","s"ometh8 ing" id 期望 => "something","someth8 ing"

我正在使用 scala,但任何解决方案都会很棒!

谢谢!!

【问题讨论】:

  • 您可以为每个值使用'"' + x.replace('"', '') + '"'
  • 您有什么特别的原因要使用正则表达式吗?字符串替换会简单得多。
  • 正确转义的引号怎么样,例如"a""b","cd"

标签: python regex scala csv regex-negation


【解决方案1】:

简单的解决方案

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,即第一个捕获组的内容。

我仍然认为第一个解决方案更干净,更容易理解。

【讨论】:

    【解决方案2】:
    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 中包含字符串的最后一部分

    【讨论】:

      猜你喜欢
      • 2016-02-14
      • 2013-08-27
      • 1970-01-01
      • 2021-09-02
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多