Python Regex: добавьте ограничение, что это НЕ должно быть совпадением, если где-то перед совпадением есть кавычка И где-то после

Я хотел бы:

  1. удалите все начальные пробелы в приведенных ниже примерах и
  2. исключать совпадения, которые в некоторой позиции перед строкой имеют кавычку И в некоторой позиции после строки другую кавычку (т. е. строки, которые НЕ должны совпадать, заключены в кавычки, но кавычки не обязательно будут непосредственно до и после строки нить).

Я пытался комбинировать отрицательный взгляд назад и взгляд вперед, но я почему-то не могу этого понять.

Большое спасибо!

Мое текущее регулярное выражение Python выглядит следующим образом:

r'''(?<=[@])\s*[A-Z0-9.]+(?=\()'''
  1. @STRING1( # Результат: 'STRING1' --> работает
  2. @ STRI..NG2( # Результат: ' STRI..NG2' --> хорошо, но предпочтительнее исключать пробелы
  3. @ STRING.3( # Результат: ' STRING.3' --> хорошо, но предпочтительнее исключать пробелы

Пример текста:
@STRING4("@STRING5( и, возможно, "еще один @STRING6("__"может быть, здесь текст") и @STRING7( " может быть и даже еще один @STRING8( " --- " и "последний" " @STRING9( &"может быть еще немного "текста"

Прямо сейчас это возвращает (включая начальные пробелы):

  • "STRING4"
  • "STRING5"
  • "STRING6"
  • "STRING7"
  • "STRING8"
  • "STRING9"

Желаемый возврат:

  • "STRING4"
  • "STRING6"
  • "STRING8"

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

tripleee 10.12.2020 16:13

STRING6 и STRING8 имеют кавычки до и после них. То, что вы хотите, является более сложным, чем это.

Keldan Chapman 10.12.2020 16:17
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не могу сделать все, что вы хотите, из-за того, что Python не разрешает просмотр назад с нефиксированной шириной, но это:

reg = r"(?<=@)\s*([A-Z\d.]+)(?=(?:[^\"]*\"[^\"]*\")*$)"

Должно сработать. ПРИМЕЧАНИЕ. Ожидается, что кавычки должным образом сбалансированы по всей строке. Он также не учитывает экранированные кавычки (\").

Обновлено: я добавил группу захвата, которую вы можете использовать для удаления начального пробела.

Спасибо за ваш вклад! Есть ли способ сделать это не зависящим от сбалансированных котировок?

Murmelmann 10.12.2020 18:37

Я так не думаю. Но вы можете убедиться, что он сбалансирован, прежде чем использовать регулярное выражение довольно легко. Что-то вроде if teststring.count('"') % 2 == 1: teststring = teststring + '"'

Keldan Chapman 10.12.2020 19:48
Ответ принят как подходящий

Один из способов - это следующее регулярное выражение

reg = r'(?:\"[^\"]+\")|(?:@\s*([A-Z0-9.]+)\()'

Затем вам нужно проверить, есть ли у совпадения группа 1. Если это соответствует, в противном случае это ложное совпадение.

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

Murmelmann 10.12.2020 18:29

Я попробовал ваше решение с несколькими тестовыми строками, и все они работали отлично. Спасибо

Murmelmann 11.12.2020 12:11

Другие вопросы по теме