正则表达式匹配单引号括起来的单引号

时间:2018-04-06 21:01:27

标签: python regex

我正在尝试解析使用单引号的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'"
}

所以我认为我需要的是一种匹配所有单引号的正则表达式,但是用单引号括起来的那些。 不幸的是,我尝试了各种变通方法,但我似乎无法做到正确......

有什么建议吗?

3 个答案:

答案 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})*$)

Demo

  • 单词前单引号匹配条件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)