Я хотел бы:
Я пытался комбинировать отрицательный взгляд назад и взгляд вперед, но я почему-то не могу этого понять.
Большое спасибо!
Мое текущее регулярное выражение Python выглядит следующим образом:
r'''(?<=[@])\s*[A-Z0-9.]+(?=\()'''
Пример текста:
@STRING4("@STRING5( и, возможно, "еще один @STRING6("__"может быть, здесь текст") и @STRING7( " может быть и даже еще один @STRING8( " --- " и "последний" " @STRING9( &"может быть еще немного "текста"
Прямо сейчас это возвращает (включая начальные пробелы):
Желаемый возврат:
STRING6 и STRING8 имеют кавычки до и после них. То, что вы хотите, является более сложным, чем это.
Я не могу сделать все, что вы хотите, из-за того, что Python не разрешает просмотр назад с нефиксированной шириной, но это:
reg = r"(?<=@)\s*([A-Z\d.]+)(?=(?:[^\"]*\"[^\"]*\")*$)"
Должно сработать. ПРИМЕЧАНИЕ. Ожидается, что кавычки должным образом сбалансированы по всей строке. Он также не учитывает экранированные кавычки (\"
).
Обновлено: я добавил группу захвата, которую вы можете использовать для удаления начального пробела.
Спасибо за ваш вклад! Есть ли способ сделать это не зависящим от сбалансированных котировок?
Я так не думаю. Но вы можете убедиться, что он сбалансирован, прежде чем использовать регулярное выражение довольно легко. Что-то вроде if teststring.count('"') % 2 == 1: teststring = teststring + '"'
Один из способов - это следующее регулярное выражение
reg = r'(?:\"[^\"]+\")|(?:@\s*([A-Z0-9.]+)\()'
Затем вам нужно проверить, есть ли у совпадения группа 1. Если это соответствует, в противном случае это ложное совпадение.
Привет, спасибо за ваш ответ! Это выглядит очень многообещающе. Я постараюсь провести несколько тестов и дать вам соответствующий отзыв. Этот подход также, кажется, не нуждается в сбалансированном количестве скобок, что приятно.
Я попробовал ваше решение с несколькими тестовыми строками, и все они работали отлично. Спасибо
Ваше описание проблемы звучит так, как будто вам следует искать правильный синтаксический анализатор (или, возможно, лексер) вместо регулярного выражения.