在python中使用正则表达式嵌套括号

use*_*387 5 python regex text

我有这样的事情:

Othername California (2000) (T) (S) (ok) {state (#2.1)}
Run Code Online (Sandbox Code Playgroud)

是否有正则表达式代码获取:

Othername California ok 2.1
Run Code Online (Sandbox Code Playgroud)

即我想将数字保持在圆括号内,而这些数字又在{}内,并保持文本"ok"在()内.我特别需要字符串"ok"打印出来,如果包含在我的行中,但我想摆脱括号内的其他文本,例如(V),(S)或(2002).

我知道可能正则表达式不是解决此类问题的最有效方法.

任何帮助,将不胜感激.

编辑:

字符串可能会有所不同,因为如果某些信息不可用,则不包含在该行中.文本本身也是可变的(例如,每行都没有"状态").所以可以有一个例子:

Name1 Name2 Name3 (2000) (ok) {edu (#1.1)}
Name1 Name2 (2002) {edu (#1.1)}
Name1 Name2 Name3 (2000) (V) {variation (#4.12)}
Run Code Online (Sandbox Code Playgroud)

Ste*_*han 8

正则表达式

(.+)\s+\(\d+\).+?(?:\(([^)]{2,})\)\s+(?={))?\{.+\(#(\d+\.\d+)\)\}
Run Code Online (Sandbox Code Playgroud)

正则表达图像

用于测试的文本

Name1 Name2 Name3 (2000) {Education (#3.2)}
Name1 Name2 Name3 (2000) (ok) {edu (#1.1)}
Name1 Name2 (2002) {edu (#1.1)}
Name1 Name2 Name3 (2000) (V) {variation (#4.12)}
Othername California (2000) (T) (S) (ok) {state (#2.1)}

测试

>>> regex = re.compile("(.+)\s+\(\d+\).+?(?:\(([^)]{2,})\)\s+(?={))?\{.+\(#(\d+\.\d+)\)\}")
>>> r = regex.search(string)
>>> r
<_sre.SRE_Match object at 0x54e2105f36c16a48>
>>> regex.match(string)
<_sre.SRE_Match object at 0x54e2105f36c169e8>

# Run findall
>>> regex.findall(string)
[
   (u'Name1 Name2 Name3'   , u''  , u'3.2'),
   (u'Name1 Name2 Name3'   , u'ok', u'1.1'),
   (u'Name1 Name2'         , u''  , u'1.1'),
   (u'Name1 Name2 Name3'   , u''  , u'4.12'),
   (u'Othername California', u'ok', u'2.1')
]