Почему некоторые механизмы регулярных выражений дважды сопоставляют .* в одной входной строке?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему некоторые механизмы регулярных выражений дважды сопоставляют .* в одной входной строке?

Сообщение Anonymous »

Многие механизмы регулярных выражений сопоставляют .* дважды в однострочной строке, например, при выполнении замены строки на основе регулярного выражения:
  • Первое совпадение — это, по определению, вся (однострочная) строка, как и ожидалось.
  • Во многих движках есть Второе совпадение, а именно пустая строка; то есть, даже если первое совпадение поглотило всю входную строку, .* сопоставляется снова, что затем соответствует пустой строке в конце входной строки.


    Примечание. Чтобы гарантировать, что найдено только одно совпадение, используйте ^.*

Мои вопросы:
  • Есть ли веская причина для такого поведения? После того, как входная строка будет использована полностью, я бы не ожидал еще одной попытки найти совпадение.
  • Можете ли вы почерпнуть что-то кроме метода проб и ошибок? документация/диалект/стандарт регулярных выражений поддерживает, какие механизмы демонстрируют такое поведение?
Обновить: полезный ответ revo объясняет как текущего поведения; что касается потенциального почему, см. этот связанный вопрос.

Языки/платформы, которые ДЕЙСТВИТЕЛЬНО демонстрируют такое поведение:

# .NET, via PowerShell (behavior also applies to the -replace operator)
PS> [regex]::Replace('a', '.*', '[$&]'
[a][] # !! Note the *2* matches, first the whole string, then the empty string

# Node.js
$ node -pe "'a'.replace(/.*/g, '[$&]')"
[a][]

# Ruby
$ ruby -e "puts 'a'.gsub(/.*/, '[\\0]')"
[a][]

# Python 3.7+ only
$ python -c "import re; print(re.sub('.*', '[\g]', 'a'))"
[a][]

# Perl 5
$ echo a | perl -ple 's/.*/[$&]/g'
[a][]

# Perl 6
$ echo 'a' | perl6 -pe 's:g/.*/[$/]/'
[a][]

# Others?


Языки/платформы, которые НЕ демонстрируют такое поведение:

# Python 2.x and Python 3.x

Подробнее здесь: https://stackoverflow.com/questions/523 ... put-string
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»