2016-09-16 74 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去。