我正在尝试解析使用单引号的JSON文件,以获取有效的Elasticsearch批量加载JSON格式。
我想要做的是用双引号替换单引号,但如果单引号用单引号括起来,我不想这样做。
示例:
{
'title': 'Charlie's Angels',
'review': 'I don't really like this 'movie''
}
应转换为:
{
"title": "Charlie's Angels",
"review": "I don't really like this 'movie'"
}
所以我认为我需要的是一种匹配所有单引号的正则表达式,但是用单引号括起来的那些。 不幸的是,我尝试了各种变通方法,但我似乎无法做到正确......
有什么建议吗?
答案 0 :(得分:0)
如果输入真的是这样,当然我正在做一些假设,我会用sed
来修复它(我不会称之为转换):
sed "s/^\([ \t]*\)'/\1\"/; s/'\(:[ \t]*\)'/\"\1\"/; s/'[ \t]*$/\"/" < data
{
"title": "Charlie's Angels"
"review": "I don't really like this 'movie'"
}
答案 1 :(得分:0)
你想要这样的输出吗?
{
"title": "Charlie's Angels",
"review": "I don't really like this 'movie'"
"review": "I don't really like 'this movie'"
"review": "I don't really like 'this' movie"
"review": "'I don't' really like 'this' movie"
}
我使用2 regex
来获取此输出。
(?<=\w(?='\w))'
Demo,,,在预处理过程中用于将单词中的'
替换为另一个独特的字符串(在这种情况下为@@@
)。
在匹配此正则表达式的情况下,将'
替换为"
。
(?m)(?<=\s)(?!'[^']*(?:(?:'[^']*){2})*$)'|'(?=[\.\s\,\:])(?=[^']*(?:(?:'[^']*){2})*$)
a space
存在于引号之前,number of afterward quotes
必须为odd
。even
且报价后只有allowed character
。Python脚本可能是这样的
ss="""{
'title': 'Charlie's Angels',
'review': 'I don't really like this 'movie''
'review': 'I don't really like 'this movie''
'review': 'I don't really like 'this' movie'
'review': ''I don't' really like 'this' movie'
}"""
import re
rexpre= re.compile(r"(?<=\w(?='\w))'")
rexquot= re.compile(r"(?m)(?<=\s)(?!'[^']*(?:(?:'[^']*){2})*$)'|'(?=[\.\s\,\:])(?=[^']*(?:(?:'[^']*){2})*$)")
ss=re.sub('@@@',"'",rexquot.sub('"',rexpre.sub("@@@",ss)))
print(ss)
答案 2 :(得分:-1)
我能用正则表达式做的最好的是:
(:?'(.*?)'([:,\s]))
它只匹配后跟空格,冒号或逗号的引号,测试用例中的确定,但可能无法始终有效。对于更多测试,我需要更多测试数据。
您可以像这样使用此正则表达式:
data = re.sub("(:?'(.*?)'([:\s]))", lambda m:f'"{m.groups()[1]}"{m.groups()[2]}',data)