Регулярное выражение — несколько отрицательных просмотров назад

Я работаю над сопоставлением строк из поля опроса, которое спрашивает об основной области исследования.

В разделе «Искусство» я хочу сопоставить все типы степеней искусств, но специально исключить гуманитарные науки, кулинарное искусство и словесность.

Этот код правильно исключает «гуманитарные науки», но я не смог перечислить несколько вещей, которые нужно исключить.

Я использую функцию grepl в R с Perl-совместимыми регулярными выражениями.

field_1_1_arts <-c("\\b(dance|ballet|design|film|(?<!liberal )arts?|music|photograph(ic|y)|theat(er|re)|performing|visual)\\b") 

data$field_1_1_arts <- grepl(field_1_1_arts,data$major_fields,ignore.case=TRUE, perl=TRUE)

Я пытался:

#this allows both liberal and culinary to pass
field_1_1_arts <-c("\\b(dance|ballet|design|film|(?<!liberal )arts?|(?<!culinary )arts?|music|photograph(ic|y)|theat(er|re)|performing|visual)\\b") 

#this gives an invalid expression error
field_1_1_arts <-c("\\b(dance|ballet|design|film|(?<!(liberal|culinary) )arts?|music|photograph(ic|y)|theat(er|re)|performing|visual)\\b") 

person andrea    schedule 10.05.2016    source источник
comment
а как насчет l[ia] :} соответствует только языковому, кулинарному и либеральному, но ни одному другому, например, x <- c('dance','ballet','design','film','liberal','arts','music','photograph', 'theater','performing','visual','culinary', 'language'); grep('l[ia]', x, value = TRUE)   -  person rawr    schedule 11.05.2016


Ответы (1)


Чтобы исключить больше, чем libral, просто добавьте больше отрицательных просмотров назад, например:

"\\b(dance|ballet|design|film|(?<!liberal )(?<!culinary )(?<!language )arts?|music|photograph(ic|y)|theat(er|re)|performing|visual)\\b"
                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

См. демонстрацию регулярного выражения.

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

"\\b(dance|ballet|design|film|(?<!liberal |culinary |language )arts?|music|photograph(ic|y)|theat(er|re)|performing|visual)\\b"
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

См. другую демонстрацию

person Wiktor Stribiżew    schedule 10.05.2016
comment
Спасибо за ссылку. Действительно полезный инструмент. @Виктор Стрибижев - person andrea; 11.05.2016