【问题标题】:Python regular expression; brackets within bracketsPython 正则表达式;括号内的括号
【发布时间】:2026-01-16 17:35:01
【问题描述】:

我知道这里有很多 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)

我试图合并像这样的“不”:?!A-Za-z0-9(\[.*?\]),这是我从python manual 获得的,但对此进行的各种尝试都不起作用。

唯一的问题是上面的代码也返回[THIS2CAN2Have-SymbolsAndNumbers0],我不想要这个,因为它被括号括起来了。

重要的是,我卡住的地方是方括号和圆括号之间可以有文本和数字,如下例所示:(blah[THIS2CAN2Have-SymbolsAndNumbers0])

有人可以帮忙吗?

作为旁注,仅供参考,一旦我弄清楚正则表达式的最终目标是合并到一个循环中:

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

编辑 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])' 来自其他输出,而不是在圆括号中。

【问题讨论】:

标签: python regex parsing


【解决方案1】:

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

  • 未括在括号中。 \[[^]]+\](?!\))
  • 括在括号中。 \[[^]]+\](?=\))

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

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

我的回答假设括号是平衡的,并且结束 ) 跟在 ] 之后。

在 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])

【讨论】:

  • 您的输出与您的代码不匹配(假设它有效)。 [THIS2CAN2Have-SymbolsAndNumbers0] 应该是最后打印的,因为它被括在括号中。
  • ..?在我的机器上运行。
  • @FHTMitchell 真的吗?否决票?你甚至运行过代码吗?
  • 是的,这是错误的答案。为什么[ThisIsText123] 是最后一个输出?
  • @FHTMitchell 已修复。