Regex - отрицательный просмотр назад для любого символа, за исключением чистых пробелов

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

--hello (match)
--goodbye (match)
ROW_NUMBER() OVER (ORDER BY DATE) --date (fail)
  --comment with some indentation (match)
    --another comment with some indentation (match)

Самое близкое, что у меня есть, это этот шаблон, который я сделал (?<!.)--.*\n, который дает мне этот результат

--hello (match)
--goodbye (match)
ROW_NUMBER() OVER (ORDER BY DATE) --date (fail)
  --comment with some indentation (fail)
    --another comment with some indentation (fail)

Я пробовал (?<!\s)--.*\n и (?<=\S)--.*\n, но оба не возвращают совпадений

Обновлено: regexr.com более четко иллюстрирует проблему regexr.com/6j0mt

Попробуйте (?<=^[^\S\r\n]*)--.* или ^\h*\K--.*. Или просто используйте ^[^\S\r\n]*(--.*) и получите значение группы 1.

Wiktor Stribiżew 06.04.2022 12:13

Если вы просто пытаетесь проверить каждую строку, используйте: ^[ \t]*--

anubhava 06.04.2022 12:16

Ни один из этих шаблонов не помогает

RoyalSwish 06.04.2022 12:22

Проверьте это: regexr.com/6j0nc

anubhava 06.04.2022 12:30
regexr.com/6j0nf и regexr.com/6j0ni — оба моих лучших предложения работают (JS протестирован в Chrome).
Wiktor Stribiżew 06.04.2022 12:31

Аааа, я вижу, вы изменили флаги, чтобы включить многострочный /gm, у меня был только глобальный /g и, следовательно, он не работал.

RoyalSwish 06.04.2022 12:36

Да, нам нужно использовать m (MULTILINE), так как мы используем якорь ^

anubhava 06.04.2022 12:38

Итак, что работает для вас?

Wiktor Stribiżew 06.04.2022 13:23

Все 3 в итоге заработали, просто нужно было добавить многострочный флаг, чтобы все заработало - спасибо обоим за вашу помощь.

RoyalSwish 06.04.2022 14:38

Нет, не совсем возможно, первая будет работать в .NET и JavaScript, а версия с \K будет работать в PCRE/Onigmo. Где вы используете регулярное выражение?

Wiktor Stribiżew 06.04.2022 15:00

Я использую свой в Python с помощью модуля regex, просто выбрал первый, который я выбрал, который является шаблоном (?<=^[^\S\r\n]*)

RoyalSwish 06.04.2022 15:53
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
11
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С PyPi regex вы можете использовать

import regex

text = r"""--hello
--goodbye
ROW_NUMBER() OVER (ORDER BY DATE) --date
  --comment with some indentation
    --another comment with some indentation"""

print( regex.findall(r'(?<=^[^\S\r\n]*)--.*', text, regex.M) )
# => ['--hello', '--goodbye', '--comment with some indentation', '--another comment with some indentation']

См. этот Демонстрация Python онлайн.

Или с Python по умолчанию re:

import re
 
text = r"""--hello
--goodbye
ROW_NUMBER() OVER (ORDER BY DATE) --date
  --comment with some indentation
    --another comment with some indentation"""
 
print( re.findall(r'^[^\S\r\n]*(--.*)', text, re.M) )

См. эта демонстрация Python.

Детали узора

  • (?<=^[^\S\r\n]*) - положительный просмотр назад, который соответствует местоположению, которому непосредственно предшествует начало строки/строки и ноль или более горизонтальных пробелов
  • ^ - начало строки (здесь строка, т.к. используется опция re.M / regex.M)
  • [^\S\r\n]* - ноль или более символов, кроме символов без пробелов, символов CR и LF (любые пробелы, кроме символов возврата каретки и символов перевода строки)
  • (--.*) - Группа 1: -- и остальная часть строки (.* соответствует как можно большему числу символов, отличных от символов разрыва строки).

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