Найти переписанные слова с Regex в списке R - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть строка элементов, разделенных точкой с запятой, и я хочу выяснить, соответствует ли шаблон любому из элементов в строке:

string <- "CPT1B;CPT1B;CPT1B;CHKB-CPT1B;CPT1B;CPT1B;CPT1B;CPT1B"

Я хочу знать, какое регулярное выражение используется для соответствия любому из этих элементов, я имею в виду, я хочу получить TRUE, если какой-либо из элементов соответствует, например, "CPT1B", для этого я использую:

grepl(paste("[^;]","CPT1B,"[$;]",sep = ""),string)
TRUE

Я использовал "[^;]" и "[$;]", потому что я хочу получить TRUE, если какой-либо из элементов совпадает.

Моя проблема возникла, когда я пытаюсь сопоставить с «CHKB-CPT1B», потому что, если я использую то же выражение:

grepl(paste("[^;]","CHKB-CPT1B","[$;]",sep = ""),string)
FALSE

Я получаю ЛОЖЬ, я думаю, что это из-за дефиса в слове, и я хотел бы знать, как заставить grepl читать слово с дефисом как одно слово.

Я не хочу использовать «CHKB \ -CPT1B», потому что этот шаблон будет получен от итератора, который может быть как дефисом, так и не дефисом слов. И я также хотел бы не разбивать исходную строку на ";"

1 Ответ

0 голосов
/ 27 апреля 2018

Вам нужно использовать группы чередования:

grepl(paste0("(?:^|;)", "CPT1B", "(?:$|;)"),string)
[1] TRUE

Группа без захвата (?:^|;) соответствует началу строки или ;, а (?:$|;) соответствует либо концу строки, либо ;.

Вы также можете использовать lookarounds с perl=TRUE (то есть шаблоном PCRE):

grepl(paste0("(?<![^;])", "CPT1B", "(?![^;])"),string, perl=TRUE)

Здесь отрицательный внешний вид (?<![^;]) соответствует любому расположению, которому непосредственно предшествует ; или начало строки, а отрицательный обратный взгляд (?![^;]) требует, чтобы следующий символ был ; или конец строки.

...