Python re.sub():在两个不同类别之间替换字符

Python re.sub():在两个不同类别之间替换字符,python,regex,json,Python,Regex,Json,我想将嵌套的方括号结构转换为JSON格式的方括号结构 input_string = '( np ( ap ( !b ( 显微 ) ) !np ( !n ( 解剖学 ) )' output_string = '[ "np", [ "ap", [ "!b" , "显微" ] ] [ "!np", [ "!n" , "解剖学" ] ] ]' 所以,我需要做三个改变 将模式英文字母(英文字母替换为“英文字母”[“英文字母” 例如,ap(!b->“ap”,[“!b” 将英文字母(中文字母替换为“

我想将嵌套的方括号结构转换为JSON格式的方括号结构

input_string = '( np ( ap ( !b ( 显微 ) ) !np ( !n ( 解剖学 ) )'    
output_string = '[ "np", [ "ap", [ "!b" , "显微" ] ] [ "!np", [ "!n" , "解剖学" ] ] ]'
所以,我需要做三个改变

  • 将模式英文字母(英文字母替换为“英文字母”[“英文字母”
    例如,
    ap(!b
    ->
    “ap”,[“!b”

  • 将英文字母(中文字母替换为“英文字母”、“中文字母”
    例如,
    !b(显微->
    “!b”显微"

  • 将模式)英文字母替换为][“英文字母”

  • 我不知道该怎么做,尤其是第二个。我试过将字母分为两个列表,即中文和英文,但我不知道如何匹配英文字母的模式(中文字母

    我假设最后一个
    ]
    输出字符串的
    是一个输入错误,因为此括号与任何开头括号都不匹配。下面是一个尝试,它是否满足您的要求?它至少应该让您开始。它当然可以优化

    >>> input_string = re.sub('\(', '[', input_string)
    >>> input_string
    '[ np [ ap [ !b [ 显微 ) ) !np [ !n [ 解剖学 ) )'
    >>> input_string = re.sub('\)', ']', input_string)
    >>> input_string
    '[ np [ ap [ !b [ 显微 ] ] !np [ !n [ 解剖学 ] ]'
    >>> input_string = re.sub(r'([a-zA-Z!]+)', r'"\1",', input_string)
    >>> input_string
    '[ "np", [ "ap", [ "!b", [ 显微 ] ] "!np", [ "!n", [ 解剖学 ] ]'
    >>> input_string = re.sub(r'(",\ )\[\ ([^\x00-\x7F]+)',r'\1"\2"' ,input_string)
    >>> input_string
    '[ "np", [ "ap", [ "!b", "显微" ] ] "!np", [ "!n", "解剖学" ] ]'
    

    这里有另一个选项可以使用

    >>> original = '( np ( ap ( !b ( 显微 ) ) !np ( !n ( 解剖学 ) )'
    >>> modified = re.sub(r'([^() ]+)', '"\\1",', original)
    >>> modified = re.sub(r'(", )\( ("[^\x00-\x7F]+"),', '\\1\\2', modified)
    >>> modified = modified.replace('(', '[').replace(')', ']')
    
    输出

    [ "np", [ "ap", [ "!b", "显微" ] ] "!np", [ "!n", "解剖学" ] ]
    

    代替
    中文字母
    使用
    不是英文字母,不是空格,不是其他字符
    我想用几个步骤来解决类似的问题。@timgeb是的,你是对的。我没有意识到最后一个括号“]”与开头括号不匹配。现在我应该在“!np”前面添加一个额外的开头括号。非常感谢!