Python正则表达式;括号内的括号

时间:2018-08-30 10:45:47

标签: python regex parsing

我知道这里有很多python正则表达式问题,即使有示例我也无法弄清楚我的具体问题。

我尝试使用regex101,但它没有点击。

我有这些句子:

[Hi]-THISISALOADOFTEXT-[text]
I-X-(blah[THIS2CAN2Have-SymbolsAndNumbers0])-ABCD-{x}A-AB
A-[This can 4 have any X1 rubbish in it]-ABCDDS-OH
A-F{a}R-(textnumber1)-AB-[ThisIsText123]-P-{d}C-(ThisCanHaveNumbers1)-W-[ThisIsSymbolsText123]

我只想拉出方括号之间的内容,除非方括号用括号括起来(圆括号)。

因此在上面的示例中,它将返回:

[Hi], [text]
...nothing returned for line 2...
[This can 4 have any X1 rubbish in it]
[ThisIsText123], [ThisIsSymbolsText123]

几乎可以使用以下代码:

import re
pattern = re.compile(r'(\[.*?\])')
regex = re.findall(pattern,text)

我试图合并这样的'not':python manual中的?!A-Za-z0-9(\[.*?\]),但是各种尝试均无效。

唯一的问题是上面的代码还返回了[THIS2CAN2Have-SymbolsAndNumbers0],我不希望这样做,因为它用括号括起来。

重要的是,在我遇到麻烦的地方,方括号和圆括号之间可能存在文本和数字,例如本例:(blah [THIS2CAN2Have-SymbolsAndNumbers0])

有人可以帮忙吗?

请注意,仅供参考,一旦我弄清楚正则表达式的最终目标就是将一个循环合并为:

  1. 对于每个句子,在方括号中查找文本
  2. 如果方括号未用括号括起来(圆括号),请执行一个例程。
  3. 用小括号括起来的
  4. 方括号括起来,

编辑1: 我该如何扩展它,以便对于括号中带有方括号的序列,返回括号中的完整短语。因此,例如,输入序列:

[Hi]-THISISALOADOFTEXT-[text]
I-X-(blah[THIS2CAN2Have-SymbolsAndNumbers0])-ABCD-{x}A-AB
A-[This can 4 have any X1 rubbish in it]-ABCDDS-OH
A-F{a}R-(textnumber1)-AB-[ThisIsText123]-P-{d}C-(ThisCanHaveNumbers1)-W-[ThisIsSymbolsText123]

将产生输出:

[Hi], [text]
(blah[THIS2CAN2Have-SymbolsAndNumbers0])
[This can 4 have any X1 rubbish in it]
[ThisIsText123], [ThisIsSymbolsText123]

这样,我便可以在其他输出的圆括号输出'(blah[THIS2CAN2Have-SymbolsAndNumbers0])'上而不是在圆括号中执行不同的子例程。

1 个答案:

答案 0 :(得分:3)

您可以使用以下两种模式:

  • 不包含在方括号中。 \[[^]]+\](?!\))
  • 括在方括号中。 \[[^]]+\](?=\))

根据您的新要求,您可以使用:

  • 括在方括号中,并包含在匹配项\([^[]+\[[^]]+\]\)

我的答案假设括号是平衡的,并且结尾)紧跟]

在Python中:

import re
mytext='''
[Hi]-THISISALOADOFTEXT-[text]
I-X-(blah[THIS2CAN2Have-SymbolsAndNumbers0])-ABCD-{x}A-AB
A-[This can 4 have any X1 rubbish in it]-ABCDDS-OH
A-F{a}R-(textnumber1)-AB-[ThisIsText123]-P-{d}C-(ThisCanHaveNumbers1)-W-[ThisIsSymbolsText123]
'''

print('no ():')
for i in re.findall(r'\[[^]]+\](?!\))',mytext):
    print(i)
    #do one routine

print('with ():')
for i in re.findall(r'\([^[]+\[[^]]+\]\)',mytext):
    print (i)
    #do second routine

打印:

no ():
[Hi]
[text]
[This can 4 have any X1 rubbish in it]
[ThisIsText123]
[ThisIsSymbolsText123]
with ():
(blah[THIS2CAN2Have-SymbolsAndNumbers0])