Почему gsub в R соответствует слишком большому количеству символов?

Почему gsub("^([0-9]{,5}).*","\\1",paste0(1:9,collapse = "")) возвращается [1] "123456"?

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

Я уже объяснил почему в этом моем ответе. TLDR: Всегда указывайте минимальный порог.

Wiktor Stribiżew 28.07.2024 16:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, то, что вам нужно, это что-то вроде

> gsub("^([0-9]{,5}).*", "\\1", paste0(1:9, collapse = ""), perl = TRUE)
[1] "12345"

где perl = TRUE активирован.

Это странно: в моей системе man pcrepattern говорит: «{,6} — это не квантификатор, а буквальная строка из 4 символов». Я не понимаю, почему {,5} ведет себя так {5} здесь.

user2554330 28.07.2024 14:15

@user2554330 user2554330 это интересно. К сожалению, я не эксперт по регулярным выражениям. но только что увидел, что {, n} поддерживается в стиле Perl perldoc.perl.org/perlre

ThomasIsCoding 28.07.2024 14:39

Я могу воспроизвести ваш вывод. Но я думаю, что всегда лучше указать явно «{1,5}».

s_baldur 28.07.2024 14:45

@s_baldur да, всегда полезно указывать минимальное количество вхождений.

ThomasIsCoding 28.07.2024 14:48
Ответ принят как подходящий

Использованное вами регулярное выражение не задокументировано. R документирует только {n}, {n,} и {n,m} как синтаксис повторения. Если вы используете

 gsub("^([0-9]{0,5}).*","\\1",paste0(1:9,collapse = ""))

вы получаете ожидаемый "12345" результат.

Спасибо. Первоначально я изучал регулярное выражение, используя AWK, и считаю, что оно там работает. Нет ответа, почему {,n} терпит неудачу именно таким образом, но пока у нас есть решение, которое предсказуемо и имеет смысл... :)

BBB 28.07.2024 15:59

@BBB Существует много механизмов регулярных выражений. Если у вас есть проблемы с тем, как устроен R, обратитесь к авторам движка, которые не являются RCore. Подробности смотрите ?regex.

IRTFM 28.07.2024 18:05

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

Добавлять к строке, только если найдено регулярное выражение
Как искать и выделять совпадающие тексты/фразы в текстовом содержимом всего тела документа?
Как извлечь объем из строки с помощью регулярного выражения?
Эффективный анализ формул с использованием регулярных выражений и полярных выражений
Как я могу расширить регулярное выражение, чтобы найти весь URL-адрес в этих случаях?
Как извлечь или зафиксировать значение из stdout_lines плейбука Ansible?
Добавьте пробел после указанных данных, используя регулярное выражение в Visual Studio
Регулярное выражение Python для получения текста в пределах определенного шаблона
Как исправить этот Reg ex, чтобы он соответствовал словам, написанным через дефис, где последний сегмент заканчивается на согласную, отличную от буквы m?
Замените пробелы новыми строками в числовых строках, разделенных запятыми