регулярное выражение с операторами И и ИЛИ - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь написать правильный шаблон regex для соответствия следующему условию

(содержит слово other) ИЛИ (содержит оба us И car)

Этот код работает должным образом:

str_detect(c('us cars',
             'u.s. cars',
             'us and bikes',
             'other'),
           regex('other|((?=.*us)(?=.*car))',
                 ignore_case = TRUE))
[1]  TRUE FALSE FALSE  TRUE

Однако, если я попытаюсь включить варианты us (соединенные штаты), такие как u.s. и u.s, тогда шаблонбольше не работает.

str_detect(c('us cars',
             'u.s. cars',
             'us and bikes',
             'other'),
           regex('other|((?=.*us)(?=.*u.s.)(?=.*u.s)(?=.*car))',
                 ignore_case = TRUE))
[1] FALSE FALSE FALSE  TRUE

В чем здесь проблема?Спасибо!

1 Ответ

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

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

x <- c('us cars', 'u.s. cars', 'us and bikes', 'other')
matches <- grepl("\\bother\\b|((?=.*\\bu\\.?s\\.?(?=\\s|$))(?=.*\\bcar\\b).*)", x, perl=TRUE)

Объяснение регулярного выражения:

\\bother\\b                        match "other"
|                                  OR
(
    (?=.*\\bu\\.?s\\.?(?=\\s|$))   lookahead and assert that
                                   "us" or "u.s" or "us." or "u.s." appears
    (?=.*\\bcar\\b)                lookahead and asser that "car" appears
    .*                             match anything
)

Проблема сваш первоначальный шаблон таков, что вы никогда не сопоставляете что-либо на RHS чередованияНе полное исправление, но это:

regex('other|((?=.*us)(?=.*u.s.)(?=.*u.s)(?=.*car))', ignore_case=TRUE)

должно выглядеть примерно так:

regex('other|((?=.*us)(?=.*u.s.)(?=.*u.s)(?=.*car).*)', ignore_case=TRUE)
                                                  ^^^ add this
...