Что не так с этим шаблоном регулярных выражений в R? - PullRequest
2 голосов
/ 13 февраля 2020

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

Идея состоит в том, чтобы отлавливать все, у кого есть такие структуры, как: "-0,4 F", "5 C", "- 0,6 C" и так далее. Вот моя попытка:

temp <- c("La temp es de 0.4 F", "La temp es de -5F", "nada", "tampoco nada",
    "La temp es de - 0.6    C")

temp[grepl("([+-]?\\s+[0-9]+(?:\\.[0-9]*)?)\\s+([CF])$)\\1\\2", temp)]

Мои рассуждения:

  1. [+-]?\\s*[0-9]+ допускает необязательные положительные или отрицательные знаки (только один) плюс необязательные пробелы (не требуются) и цифры от 0 -9 (хотя бы один обязательный). Это определяет мою первую группу
  2. (?:\\.[0-9]*)?)\\s+([CF])$) определяет вторую группу. Согласно этому тексту , запись (?: обозначает открывающую скобку, где может быть необязательная группа. В этом случае \\.[0-9]*)? является необязательной группой (десятичный период и несколько цифр). Затем \\s+ определяет пустые пробелы (не требуется), а ([CF])$ - конец строки (обязательно).

Если я правильно рассуждаю, у меня есть две группы регулярных выражений, поэтому Я использую \\1\\2 обратные ссылки. Мой код не работает, поэтому я получаю character(0) в результате.

Ответы [ 2 ]

3 голосов
/ 13 февраля 2020

Рекомендуемый шаблон:

Если бы это был я с нуля, я бы использовал следующее:

grep('\\d[^a-z]*[CF]', temp, value = TRUE)


 # > [1] "La temp es de 0.4 F"      "La temp es de -5F"        "La temp es de - 0.6    C"

\\d есть git

[^a-zA-Z]*, за которым не следует ни одного символа в диапазоне от az, но любые другие символы

[CF], а в конце следует C или F

Объяснение:

У вас есть куча проблем с этим регулярным выражением (если я не ошибаюсь):

  1. Вы используете группы в замена не в соответствии шаблону. Я не уверен, почему у вас есть \\1\\2 в конце вашего паттерна.

  2. У вас ненужная группировка. Различные части желаемого шаблона являются последовательными, и вы хотите просто найти их, а не заменить их.

  3. Вы предполагаете, что C или F всегда происходят в конце строки.

  4. У вас есть дополнительные скобки.

Я не эксперт, поэтому возможны другие проблемы.

NB Здесь было бы полезно использовать онлайн-переводчиков, поскольку они показывают / выделяют некоторые ошибки.

Я начал с вашего шаблона и пришел к следующему:

[+-]?\\s*[0-9+][\\.]?[0-9+]?\\s*[CF]

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

2 голосов
/ 13 февраля 2020

Можно попробовать:

grep('-?\\d+(\\.\\d+\\s+)?[CF]', temp, value = TRUE)
#[1] "La temp es de 0.4 F" "La temp es de -5F"  "La temp es de - 0.6    C"

-? - необязательный отрицательный знак

\\d+ - с последующим одним или несколькими числами

(\\.\\d+\\s+)? - с необязательным десятичным числом и пробелом (ами)

[CF] - с последующим указанием либо C, либо F.

...