Python 正则表达式提取括号和方括号中的嵌套模式

Python 正则表达式提取括号和方括号中的嵌套模式,python,regex,Python,Regex,我有 (左墙)(who)(is.v)(奥巴马)(I.p)(love.v)(他的)(演讲)(右墙) 这是一种模式,我将其拆分,得到列表中的每个括号项。我的正则表达式可以很好地工作,但用于嵌套文本,如(Ob(am)a) 例如: post_script_word_str = '(LEFT-WALL)(who)(is.v)(Obama)(,)(I.p)(love.v)(his)(speech.s)(RIGHT-WALL)' post_script_word_list = re.compile(r'\((

我有

(左墙)(who)(is.v)(奥巴马)(I.p)(love.v)(他的)(演讲)(右墙)

这是一种模式,我将其拆分,得到列表中的每个括号项。我的正则表达式可以很好地工作,但用于嵌套文本,如(Ob(am)a)

例如:

post_script_word_str = '(LEFT-WALL)(who)(is.v)(Obama)(,)(I.p)(love.v)(his)(speech.s)(RIGHT-WALL)'
post_script_word_list = re.compile(r'\(([^\)\(]*)\)').split(post_script_word_str)
print post_script_word_list

post_script_link_str = '[0 12 4 (RW)][0 7 3 (Xx)][0 1 0 (Wd)][1 2 0 (Ss)][2 6 2 (Ost)][3 6 1 (Ds)][3 4 0 (La)][5 6 0 (AN)][7 8 0 (Wq)][8 9 0 (EAh)][9 10 0 (AF)][10 11 0 (SIs)]'
post_script_link_str = re.compile(r'\[([^\]\[]*)\]').split(post_script_link_str)
print post_script_link_str
结果:

    ['', 'LEFT-WALL', '', 'who', '', 'is.v', 'Obama', ',', '', 'I.p', '', 'love.v', '', 'his', '', 'speech.s', '', 'RIGHT-WALL', '']

['', '0 12 4 (RW)', '', '0 7 3 (Xx)', '', '0 1 0 (Wd)', '', '1 2 0 (Ss)', '', '2 6 2 (Ost)', '', '3 6 1 (Ds)', '', '3 4 0 (La)', '', '5 6 0 (AN)', '', '7 8 0 (Wq)', '', '8 9 0 (EAh)', '', '9 10 0 (AF)', '', '10 11 0 (SIs)', '']
但是对于像
(Ob(am)a)
[0[1]24(RW)]
这样的输入,它会失败。我期望得到与上面相同的结果,但它给出了

['', 'LEFT-WALL', '', 'who', '', 'is.v', '(Ob', 'am', 'a)', ',', '', 'I.p', '', 'love.v', '', 'his', '', 'speech.s', '', 'RIGHT-WALL', '']

['[0 ', '1', '2 4 (RW)]', '0 7 3 (Xx)', '', '0 1 0 (Wd)', '', '1 2 0 (Ss)', '', '2 6 2 (Ost)', '', '3 6 1 (Ds)', '', '3 4 0 (La)', '', '5 6 0 (AN)', '', '7 8 0 (Wq)', '', '8 9 0 (EAh)', '', '9 10 0 (AF)', '', '10 11 0 (SIs)', '']
有什么建议吗

更新输入:

post_script_link_str = '[0 [1]2 4 (RW)][0 7 3 (Xx)][0 1 0 (Wd)][1 2 0 (Ss)][2 6 2 (Ost)][3 6 1 (Ds)][3 4 0 (La)][5 6 0 (AN)][7 8 0 (Wq)][8 9 0 (EAh)][9 10 0 (AF)][10 11 0 (SIs)]'
结果:

['[0 ', '1', '2 4 (RW)]', '0 7 3 (Xx)', '', '0 1 0 (Wd)', '', '1 2 0 (Ss)', '', '2 6 2 (Ost)', '', '3 6 1 (Ds)', '', '3 4 0 (La)', '', '5 6 0 (AN)', '', '7 8 0 (Wq)', '', '8 9 0 (EAh)', '', '9 10 0 (AF)', '', '10 11 0 (SIs)', '']

re模块无法处理嵌套结构。您需要使用具有递归功能的。另一方面,我认为
findall
方法更适合这项工作:

regex.findall(r'\[([^][]*+(?:(?R)[^][]*)*+)]', post_script_link_str)
您获得:

['0 [1]2 4 (RW)', '0 7 3 (Xx)', '0 1 0 (Wd)', '1 2 0 (Ss)', '2 6 2 (Ost)', '3 6 1 (Ds)', '3 4 0 (La)', '5 6 0 (AN)', '7 8 0 (Wq)', '8 9 0 (EAh)', '9 10 0 (AF)', '10 11 0 (SIs)']
现在只需将列表映射为删除方括号即可

图案详情:

(?R)
允许递归,因为它是整个模式的别名


*+
是所有格量词。它与
*
相同,但不允许正则表达式引擎回溯。如果不幸的是括号不平衡,它用于防止灾难性的回溯。

re模块无法处理嵌套结构。您需要使用具有递归功能的。另一方面,我认为
findall
方法更适合这项工作:

regex.findall(r'\[([^][]*+(?:(?R)[^][]*)*+)]', post_script_link_str)
您获得:

['0 [1]2 4 (RW)', '0 7 3 (Xx)', '0 1 0 (Wd)', '1 2 0 (Ss)', '2 6 2 (Ost)', '3 6 1 (Ds)', '3 4 0 (La)', '5 6 0 (AN)', '7 8 0 (Wq)', '8 9 0 (EAh)', '9 10 0 (AF)', '10 11 0 (SIs)']
现在只需将列表映射为删除方括号即可

图案详情:

(?R)
允许递归,因为它是整个模式的别名


*+
是所有格量词。它与
*
相同,但不允许正则表达式引擎回溯。如果不幸的是括号不平衡,它用于防止灾难性的回溯。

re模块无法处理嵌套结构。您需要使用具有递归功能的。另一方面,我认为
findall
方法更适合这项工作:

regex.findall(r'\[([^][]*+(?:(?R)[^][]*)*+)]', post_script_link_str)
您获得:

['0 [1]2 4 (RW)', '0 7 3 (Xx)', '0 1 0 (Wd)', '1 2 0 (Ss)', '2 6 2 (Ost)', '3 6 1 (Ds)', '3 4 0 (La)', '5 6 0 (AN)', '7 8 0 (Wq)', '8 9 0 (EAh)', '9 10 0 (AF)', '10 11 0 (SIs)']
现在只需将列表映射为删除方括号即可

图案详情:

(?R)
允许递归,因为它是整个模式的别名


*+
是所有格量词。它与
*
相同,但不允许正则表达式引擎回溯。如果不幸的是括号不平衡,它用于防止灾难性的回溯。

re模块无法处理嵌套结构。您需要使用具有递归功能的。另一方面,我认为
findall
方法更适合这项工作:

regex.findall(r'\[([^][]*+(?:(?R)[^][]*)*+)]', post_script_link_str)
您获得:

['0 [1]2 4 (RW)', '0 7 3 (Xx)', '0 1 0 (Wd)', '1 2 0 (Ss)', '2 6 2 (Ost)', '3 6 1 (Ds)', '3 4 0 (La)', '5 6 0 (AN)', '7 8 0 (Wq)', '8 9 0 (EAh)', '9 10 0 (AF)', '10 11 0 (SIs)']
现在只需将列表映射为删除方括号即可

图案详情:

(?R)
允许递归,因为它是整个模式的别名



*+
是所有格量词。它与
*
相同,但不允许正则表达式引擎回溯。如果不幸的是括号不平衡,它在这里用于防止灾难性的回溯。

你对正则表达式模块感到满意吗?@AvinashRaj:嘿,朋友,我对正则表达式感到满意。regex模块是否相同?
re
是内置模块,但
regex
是外部模块。您需要手动安装该模块。您能否提供一个复制此
[0[1]2 4(RW)]
的示例?您是否也想处理
(Ob(am)a)
?发布一个示例,该示例同时复制了预期的输出。我在您的输入中没有找到
[0[1]2 4(RW)]
子字符串。您对正则表达式模块感到满意吗?@AvinashRaj:嘿,朋友,我对正则表达式感到满意。regex模块是否相同?
re
是内置模块,但
regex
是外部模块。您需要手动安装该模块。您能否提供一个复制此
[0[1]2 4(RW)]
的示例?您是否也想处理
(Ob(am)a)
?发布一个示例,该示例同时复制了预期的输出。我在您的输入中没有找到
[0[1]2 4(RW)]
子字符串。您对正则表达式模块感到满意吗?@AvinashRaj:嘿,朋友,我对正则表达式感到满意。regex模块是否相同?
re
是内置模块,但
regex
是外部模块。您需要手动安装该模块。您能否提供一个复制此
[0[1]2 4(RW)]
的示例?您是否也想处理
(Ob(am)a)
?发布一个示例,该示例同时复制了预期的输出。我在您的输入中没有找到
[0[1]2 4(RW)]
子字符串。您对正则表达式模块感到满意吗?@AvinashRaj:嘿,朋友,我对正则表达式感到满意。regex模块是否相同?
re
是内置模块,但
regex
是外部模块。您需要手动安装该模块。您能否提供一个复制此
[0[1]2 4(RW)]
的示例?您是否也想处理
(Ob(am)a)
?发布一个同时复制这两个内容和预期输出的示例。我没有在您的输入中找到
[0[1]24(RW)]
子字符串。谢谢,亲爱的,我尝试了这个
re.compile(r'\[([^][*+(?:(?r)[^][]*])。split(Post\u script\u word str)
它给出了“错误:多次重复”@niper:而不是复制/粘贴您在帖子中看到的第一个模式,花时间读它,就像我花时间写它一样。谢谢。谢谢亲爱的,我试过这个
re.compile(r'\[([^][]*+(?:(?r)[^][]*])*+)))。split(post\u script\u word\u str)
它给出了“错误:多次重复”@niper:与其复制/粘贴你在帖子中看到的第一个模式,不如花点时间读它,就像我花时间写它一样。谢谢。谢谢亲爱的,我试过这个
re.compile(r'\[([^][]*+(?:(?r)[^][]*])*+)))。split(post\u script\u word\u str)
它给出了“错误:多次重复”@niper:不要复制/粘贴你在帖子中看到的第一个模式,而是花时间在s中阅读它