Не удается найти правильный синтаксис регулярного выражения для соответствия новой строке или концу строки

Это похоже на очень простой вопрос, но я не могу найти ответ нигде.

(Примечания: Я использую Python, но это не имеет значения.)

Скажем, у меня есть следующая строка:

s = "foo\nbar\nfood\nfoo" 

Я просто пытаюсь найти регулярное выражение, которое будет совпадать с обоими примерами «foo», но не «еда», основанная на том факте, что «foo» в «пище» не сразу следует либо новой линией, либо концом строка.

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

Вот некоторые из вещей, которые я пробовал, с результатами (Примечание: в результате я хочу [ foo\n , foo ]):

foo[\n\Z] => [ 'foo\n' ]

foo(\n\Z) => [ '\n' , '' ] <= Это похоже на новую строку и EOS, но не foo

foo($|\n) => [ '\n' , '' ]

(foo)($|\n) => [( foo , '\n' ), ( foo , '' )] <= Почти там, и это полезный план B, но я хотел бы найти идеальное решение ,

Единственное, что я нашел, что работает:

foo$|foo\n => [ 'foo\n' , `'foo']

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


Интересное в сторону: ближайший вопрос SO, который я мог бы найти в моей проблеме, был следующим: в регулярном выражении совпадают либо конец строки, либо определенный символ

Здесь я мог бы просто заменить \n на свой «конкретный символ». Теперь принятый ответ использует regex /(&|\?)list=.*?(&|$)/ . Я заметил, что OP использует JavaScript (вопрос был помечен тегом javascript ), поэтому, возможно, интерпретатор JavaScript regex отличается, но когда я использую точные строки, заданные в вопросе с указанным выше выражением в Python, я получаю плохие результаты:

 >>> findall("(&|\?)list=.*?(&|$)", "index.php?test=1&list=UL") [('&', '')] >>> findall("(&|\?)list=.*?(&|$)", "index.php?list=UL&more=1") [('?', '&')] 

Итак, я в тупике.

3 Solutions collect form web for “Не удается найти правильный синтаксис регулярного выражения для соответствия новой строке или концу строки”

 >>> import re >>> re.findall(r'foo(?:$|\n)', "foo\nbar\nfood\nfoo") ['foo\n', 'foo'] 

(?:...) делает группу, не связанную с захватом .

Это работает, потому что (из ссылки на модуль ):

re.findall (pattern, string, flags = 0)

Верните все совпадающие совпадения шаблонов в строке, как список строк. Строка сканируется слева направо, а совпадения возвращаются в найденном порядке. Если одна или несколько групп присутствуют в шаблоне, верните список групп; это будет список кортежей, если шаблон имеет более одной группы. Пустые совпадения включаются в результат, если они не касаются начала другого матча.

Вы можете использовать re.MULTILINE и включить дополнительную строку после $ в ваш шаблон:

 s = "foo\nbar\nfood\nfoo" pattern = re.compile('foo$\n?', re.MULTILINE) print re.findall(pattern, s) # -> ['foo\n', 'foo'] 

Если вас беспокоит только foo :

 In [42]: import re In [43]: strs="foo\nbar\nfood\nfoo" In [44]: re.findall(r'\bfoo\b',strs) Out[44]: ['foo', 'foo'] 

\b обозначает границу слова:

\b

Соответствует пустой строке, но только в начале или в конце слова. Слово определяется как последовательность буквенно-цифровых символов или символов подчеркивания, поэтому конец слова обозначается пробелом или буквенным или несимвольным символом. Обратите внимание, что формально \ b определяется как граница между символом \ w и a \ W (или наоборот) или между \ w и началом / концом строки, поэтому точный набор символов, считающийся буквенно-цифровым, зависит от по значениям флагов UNICODE и LOCALE. Например, r '\ bfoo \ b' соответствует 'foo', 'foo.', '(Foo)', 'bar foo baz', но не 'foobar' или 'foo3'. Внутри диапазона символов \ b представляет символ обратного пробела для совместимости с строковыми литералами Python.

( Источник )

  • Поиск папок на основе предопределенной структуры папок
  • Регулярное выражение Python для поиска содержимого ссылок разметки MediaWiki
  • Regex, чтобы получить список всех слов со специальными буквами (unicode graphemes)
  • Удаление Unicode \ uxxxx в String из JSON с использованием Regex
  • Исходные строки Python и unicode: как использовать веб-вход в качестве шаблонов регулярных выражений?
  • Сортировка буквенно-цифровых клавиш словаря в python
  • Python Regex для переносных слов
  • Исходная строка и регулярное выражение в Python
  • Python - лучший язык программирования в мире.