【问题标题】:Conversion of String to JSON using Regex使用正则表达式将字符串转换为 JSON
【发布时间】:2021-09-16 05:59:57
【问题描述】:

我正在处理一个文件,该文件的一列中包含以下格式的数据。我需要为相应的键和值添加双引号,以便我可以将字符串解析为 JSON

输入数据: Street:StreetName,Address:ABC Road, CityName,PinCode:00000

我正在尝试使用下面的正则表达式,它以某种方式将输出弄乱了,因为 Address Key 在其值内。

我尝试的正则表达式是([a-zA-Z0-9-]+):([a-zA-Z0-9-,]+),替换为\"$1\":\"$2\"

当前输出(查看 Key 'Address' 的值):"Street":"StreetName","Address":"ABC" Road, CityName,"PinCode":"00000"

预期输出:"Street":"StreetName","Address":"ABC Road, CityName","PinCode":"00000"

但是,如果值中没有逗号,则此方法有效

输入:Street:StreetName,Address:ABC Road CityName,PinCode:00000

输出:"Street":"StreetName","Address":"ABC Road CityName","PinCode":"00000"

我知道我的正则表达式中缺少某些内容。请问有什么想法吗?

提前致谢

【问题讨论】:

  • 您将; 作为第一个字段之间的分隔符,将, 作为最后两个字段之间的分隔符 - 对吗?
  • @SamWhan 我很糟糕,这是一个错字。分隔符仅为 , 。现已编辑。
  • 如果不是JSON,为什么要显式转成JSON,解析成JSON?你不能不通过 JSON 直接按自己的条件解析它吗?例如。用逗号分隔,然后用冒号分隔?
  • @deceze 如果字段数据有逗号,则不起作用。您需要对格式进行某种验证才能提取它。
  • @Sam 绝对是的。如果数据包含引号,则此 JSON“转换”也会失败。因此,由于这两种方法在特定情况下都会失败,a)我们需要了解更多关于上述情况的信息,并且 b)您应该使用更简单的选项(不是 regexen + JSON)。

标签: regex pyspark


【解决方案1】:

你可以试试

(.*?):(.*?)(?:$|(,)(?=\w+:))

它匹配并捕获 key 直到冒号,只匹配冒号,最后匹配并捕获值,直到字符串的末尾,或 一个新的(捕获前面的分隔符以便能够在下面的替换中使用)。

用捕获的组和正确的格式字符串(例如"\1" : "\2"\3\r\n)替换它,你就到家了;)

在 regex101 上查看 here

注意!在对以下键的测试中,它假设 只是单词字符(a-zA-Z0-9_)。可能需要调整:/

【讨论】:

    【解决方案2】:

    你可以使用

    (\w[\w-]*):(.*?)(?=,\s*[\w-]+:|$)
    

    像你一直在做的那样替换为"$1":"$2"。请参阅regex demo

    详情

    • (\w[\w-]*) - 第 1 组:一个单词 char,然后是零个或多个单词或 - chars
    • : - 冒号
    • (.*?) - 第 2 组:除换行符之外的任何零个或多个字符,尽可能少
    • (?=,\s*[\w-]+:|$) - 最多一个逗号、零个或多个空格、一个或多个单词/连字符,然后是冒号或字符串结尾。

    示例代码sn-p:

    import pyspark.sql.functions as F
    df.select(F.regexp_replace('str', r'(\w[\w-]*):(.*?)(?=,\s*[\w-]+:|$)', '"$1":"$2"').alias('d')).show()
    

    【讨论】:

      猜你喜欢
      • 2019-12-20
      • 1970-01-01
      • 2017-05-15
      • 2012-01-28
      • 2022-11-18
      • 1970-01-01
      • 2013-06-09
      • 2015-09-09
      • 1970-01-01
      相关资源
      最近更新 更多