2016-09-16 4 views
0

Я ищу, чтобы извлечь из трех наборов данных из трех буквенных кодов. Каждая запись имеет набор из 3 заглавных букв, которые не являются «CCV», но они различаются по месту размещения в каждой записи.Определите триплеты заглавных букв

В настоящее время я пытаюсь: (?!CCV)[A-Z]{3}

У меня есть набор данных записей, как:

CCV_21123214_AAA CCV_02390394_AAC 094804958_AAA_ee9r80 BLAH_CCV_odfdkk_BBB

и хотите:

AAA AAC AAA BBB

Проблема мой текущий подход продолжает захватывать письма из другого капитала ред слова больше, чем 3-х букв, как «Л», получая его части как тройни, как:

AAA BLA LAH AAC

Есть ли способ, чтобы найти только триплеты прописных букв?

+0

Какой язык или инструмент вы используете? –

+0

Я работаю в основном в R. – Furmole

+1

Используйте пару отрицательных обращений на обоих концах '(? revo

ответ

0

Что Вы могли бы хотеть что-то вроде этого:

(?<=\b|_)(?!CCV)[A-Z]{3}(?=\b|_) 

Во-первых, это будет выглядеть сзади, чтобы убедиться, что предыдущий маркер либо подчеркивание или граница слова (\b). Тогда он будет смотреть вперед, чтобы убедиться, что он не находит страшного CCV. Затем он будет соответствовать 3-м столицам, а затем посмотрим вперед, чтобы следующий токен был либо символом подчеркивания, либо границей слов.

Demonstration at Regex101

Поскольку вы работаете в R, вам нужно, чтобы избежать обратных косых черт, уступая

(?<=\\b|_)(?!CCV)[A-Z]{3}(?=\\b|_) 

в качестве конечной строки шаблона.

+0

Он работает по большей части, но по какой-то причине он не обнаруживает коды, если они находятся в конце записи. Например, tddAH_CCV40413269_AAC не возвращает AAC. – Furmole

+0

Он работает нормально, когда я его тестирую. Требует ли R, чтобы вы избежали обратных косых черт? –

+0

Это то, чего не хватало, спасибо за помощь. – Furmole

0

Если вы только interrested в НАХОДЯТСЯ щие строки с буквами, или можно использовать группы захвата для извлечения комбинации, вы могли бы пойти с

(?:\b|_)(?!CCV)([A-Z]{3})(?:\b|_) 

Он проверяет на границу слова (\b) или подчеркивание (_), за которым не следует CCV, захватывая (просто сопоставляя, если вы удаляете круглые скобки) буквы, а затем снова соответствующие границе слова или подчеркиванию.

Check it out here at regex101.

Если просмотровых задом поддерживаются (не JavaScript), то вы могли бы пойти с

(?<=\b|_)(?!CCV)([A-Z]{3})(?=\b|_) 

Example here.

Смежные вопросы