2016-09-16 51 views
0

我正在尋找從數據集中提取一系列3字母代碼。 每個條目都有一組3個不是「CCV」的大寫字母,但它們的 在每個條目中的位置有所不同。標識大寫字母三聯體

目前我正嘗試: (?!CCV)[A-Z]{3}

我有條目類似的數據集:

CCV_21123214_AAA CCV_02390394_AAC 094804958_AAA_ee9r80 BLAH_CCV_odfdkk_BBB

和希望:

AAA AAC AAA BBB

問題是我目前的做法一直在抓住其他首都的信件編輯的話不是像「BLAH」,3個字母長得到其中的一部分作爲像三胞胎:

AAA BLA LAH AAC

有沒有辦法找到唯一的大寫字母三胞胎?

+0

您使用哪種語言或工具? –

+0

我主要在R工作。 – Furmole

+1

在兩端使用一對負向變量'(?<![AZ])(?!CCV)[AZ] {3}(?![AZ])' – 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

如果你只是在找ING行interrested用字母,或者可以使用捕捉組來提取組合,您可以用

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

它檢查單詞邊界(\b)或下劃線去(_),不要跟着CCV,捕獲(只要匹配,如果刪除括號)字母,然後再匹配一個字邊界或下劃線。

Check it out here at regex101

如果查找屁股的支持(不是javascript),那麼你可以用

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

Example here去。