Регулярное выражение Python; скобки в скобках

1

Я знаю, что здесь есть слишком много вопросов о регулярном выражении 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(\[.*?\]), ?!A-Za-z0-9(\[.*?\]) я получил из руководства python, но различные попытки этого не работают.

Единственная проблема заключается в том, что приведенный выше код также возвращает [THIS2CAN2Have-SymbolsAndNumbers0], я не хочу этого, так как он заключен в круглые скобки.

Важно то, что и где я застреваю, заключается в том, что между квадратными скобками и закругленными скобками может быть текст и цифры, как в этом примере: (blah [THIS2CAN2Have-SymbolsAndNumbers0])

Может кто-нибудь помочь?

Как побочная заметка, просто FYI, конечной целью, когда я выясню регулярное выражение, является включение в цикл, который гласит:

  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])' от других выходов, а не в закругленных скобках.

  • 0
    В соответствии с вашим новым требованием попробуйте (?:\[[^]]*]|\([^)[]*\[[^)]*\))
Теги:
parsing

1 ответ

3
Лучший ответ

Вы можете использовать два следующих шаблона:

  • Не заключено в скобки. \[[^]]+\](?!\))
  • Закреплено в скобках. \[[^]]+\](?=\))

В соответствии с вашим новым требованием вы можете использовать:

  • Encloded в скобках и включить в match \([^[]+\[[^]]+\]\)

Мой ответ предполагает, что скобки сбалансированы и закрывание ) следует ].

В 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])
  • 0
    ваш вывод не соответствует вашему коду (при условии, что он работает). [THIS2CAN2Have-SymbolsAndNumbers0] должен быть напечатан последним, поскольку он заключен в квадратные скобки.
  • 1
    ..? Делает на моей машине.
Показать ещё 12 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню