Регулярное выражение Python; скобки в скобках - PullRequest
0 голосов
/ 30 августа 2018

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

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

Важно то, что я застреваю в том, что между квадратными и круглыми скобками может быть текст и цифры, как в этом примере: (бла [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])' из других выходов, а не в закругленных скобках.

1 Ответ

0 голосов
/ 30 августа 2018

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

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

Согласно вашему новому требованию вы можете использовать:

  • Заключено в скобки и включено в совпадение \([^[]+\[[^]]+\]\)

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

В 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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...