Python re.sub():替换两个不同类别之间的char

时间:2014-06-28 15:43:53

标签: python regex json

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

input_string = '( np ( ap ( !b ( 显微 ) ) !np ( !n ( 解剖学 ) )'    
output_string = '[ "np", [ "ap", [ "!b" , "显微" ] ] [ "!np", [ "!n" , "解剖学" ] ] ]'

所以,我需要做三个改变。

  1. 替换模式 english_letter(英文字母“english_letter”,[“english_letter”
    例如,ap ( !b - > "ap", [ "!b"

  2. 替换模式 english_letter(中文字母“english_letter”,“chinese_letter”
    例如,!b ( 显微 - > "!b" , "显微"

  3. ]替换模式)english_letter [“english_letter”
  4. 我无法弄清楚如何解决这个问题,尤其是第二个问题。我已经尝试将字母分为两个列表,即中文和英文,但我不知道如何匹配 english_letter的格式(中文字母

2 个答案:

答案 0 :(得分:1)

我假设您的]的最后一个output_string是拼写错误,因为此括号与任何左括号都不匹配。这是一次尝试,这是否符合您的要求?它应该至少让你开始。它当然可以优化。

>>> 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", "解剖学" ] ]'

答案 1 :(得分:1)

这是另一个使用的选项。

>>> 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", "解剖学" ] ]