Отрицательный прогноз в регулярном выражении, чтобы исключить процент (%) в R - PullRequest
0 голосов
/ 06 февраля 2019

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

Для ясности я хотел бы извлечь "123.123", но не хотел бы извлекать "123.123%"

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

c("123.123%", "123.123") %>% str_extract_all(., "\\d+\\.\\d+")

Но я хочу настроить его так, чтобы он возвращал только второй элемент (поскольку первый содержит знак процента.

Я пробовал различные комбинации следующих элементов:

c("123.123%", "123.123") %>% str_extract_all(., "\\d+\\.\\d+(!?=%)")
c("123.123%", "123.123") %>% str_extract_all(., "\\d+\\.\\d+[!?%]")
c("123.123%", "123.123") %>% str_extract_all(., "\\d+\\.\\d+!?%")
c("123.123%", "123.123") %>% str_extract_all(., "\\d+\\.\\d+!?\\%")
c("123.123%", "123.123") %>% str_extract_all(., "\\d+\\.\\d+(!?=\\%)")
# etc

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

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

c("123.123%", "123.123") %>% str_extract_all(., "\\d+\\.\\d+$")

[[1]] символ (0)

[[2]] [1] "123.123"

0 голосов
/ 06 февраля 2019

Мы можем исправить, добавив ^ и $ в начале и конце строки в шаблоне

c("123.123%", "123.123") %>% 
      str_extract_all(., "^[0-9]+\\.[0-9]+$")
0 голосов
/ 06 февраля 2019

Вы можете использовать

"\\d+\\.\\d++(?!%)"

Часть \d++(?!%) соответствует 1 или более цифрам собственно , а отрицательный прогноз (?!%) выполняется один раз после того, как все эти цифры совпадают, и происходит сбойсовпадение, если после них стоит %.

То же самое можно записать без собственнического квантификатора, как "\\d+\\.\\d+(?![%\\d])", где (?![%\\d]) также провалит совпадение, если сразу послесправа от текущего местоположения.

R демо:

> library(stringr)
> c("123.123%", "123.123") %>% str_extract_all(., "\\d+\\.\\d++(?!%)")
[[1]]
character(0)

[[2]]
[1] "123.123"
...