Python Regex для поиска неполных открывающих и закрывающих скобок - PullRequest
1 голос
/ 15 мая 2019

Я пытаюсь найти неполные открывающие и закрывающие скобки.Ниже приведены примеры.

"[[lang:foreign]"  "[lang:foreign]]"  "[[beep"  "[beep"  "hello]"  "lang:foreign]"

Я пробовал несколько выражений регулярных выражений, таких как:

\[([^()]|(?R))*\] Or
[^\[*(\[.*\))[^\]]* Or just
\W\s?\W

Я знаю, что ни одно из них не будет работать.

Мой главныйЦель состоит в том, чтобы найти неполную скобку, например [beep or [[beep or beep], а затем добавить специальный идентификационный символ перед ней.Так это будет выглядеть #specialC#[beep or #specialC#[[beep or #specialC#beep]

1 Ответ

1 голос
/ 15 мая 2019

Это кажется проще без регулярных выражений (хотя, возможно, существует более эффективный подход).

Преобразование строки в список символов (чтобы упростить подстановку символов при зацикливании), сохранение списка значений индекса открытых скобок, удаление значений индекса открытых скобок из списка, когда найдены совпадающие квадратные скобки, замените все закрывающие скобки, встречающиеся ранее соответствующую открытую скобку, замените все открытые скобки, оставшиеся в списке значений индекса после проверки всей строки, затем присоединитесь к списку, чтобы получить строку, содержащую замененные значения символов.

def unmatched(s):
    chars = list(s)
    opened = []
    for i, c in enumerate(chars):
        if c == '[':
            opened.append(i)

        if c == ']':
            if not opened:
                chars[i] = ']*UNMATCHED*'
            else:
                opened.pop()

    for i in opened:
        chars[i] = '*UNMATCHED*['

    return ''.join(chars)

Пример вывода:

d = ['[[lang:foreign]', '[lang:foreign]]', '[[beep', '[beep', 'hello]', 'lang:foreign]']
for s in d:
    print(unmatched(s))

# *UNMATCHED*[[lang:foreign]
# [lang:foreign]]*UNMATCHED*
# *UNMATCHED*[*UNMATCHED*[beep
# *UNMATCHED*[beep
# hello]*UNMATCHED*
# lang:foreign]*UNMATCHED*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...