0

在文档中,我试图查找包含字母和数字的 12 位字符串的出现。示例字符串为:“PXB111X2206”

我正在尝试使用以下命令在 R 中获取包含此字符串的行号:

FileInput = readLines("File.txt") 
prot_pattern="([A-Z0-9]{12})";
prot_string<-grep(prot_pattern,FileInput)
prot_string

这工作正常,直到它遇到包含所有大写标题的文档并返回包含单词“CONCENTRATIO”的行

我要查找的字符串是:“PXB111X2206”。我期待 grep 返回包含字符串的行号:“PXB111X2206”。但是,它返回包含以下单词的行号:“CONCENTRATIO”

我上面的表达有什么问题?知道我在这里做错了什么吗?

以下是一些示例输入:此处描述的每个设计目标都非常重要,但这只是实现成功项目所需的一个方面。

一个成功的项目是在早期确定项目目标并且从规划和编程阶段同时协调所有建筑系统的相互依赖关系的项目。

浓度:

设计目标的重点领域:可达性、美学、成本效益、>功能/运营、历史保护、生产、安全/安全和可持续,>它们的相互关系必须得到理解、评估和适当应用。

这些设计目标中的每一个都在设计目标文档编号中列出。>PXB111X2206。>

谢谢和问候, 西马克

4

2 回答 2

3

你正在使用一个非常强大的工具来完成一个非常简单的任务,表达式

[A-Z0-9]{12}

将匹配任何字母数字 12 大小的大写字符串,例如单词“CONCENTRATIO”,但是,您的“PXB111X2206”甚至不是 12 个符号长,因此不可能匹配。如果您只想匹配“PXB111X2206”,则只需将其用作正则表达式本身,例如,如果您的文件内容为:

foo
CONCENTRATIO. 
bazz
foo bar bazz PXB111X2206 foo bar bazz
foo 
bar
bazz

你使用:

grep('PXB111X2206',readLines("File.txt"))

那么 R 将只匹配第 4 行,如您所愿。

编辑

如果您正在寻找该特定模式,请尝试:

grep('[A-Z]{3}[0-9]{3}[A-Z]{1}[0-9]{4}',readLines("File.txt"))

该表达式将匹配诸如“AAADDDADDDD”之类的字符串,其中 A 是大写字母,D 是数字,正则表达式包含一个组(方括号内的符号)和一个量词(括号内的数字),它告诉前面有多少表达式将接受符号,如果不存在量词,则假定它为 1。

于 2013-07-23T18:53:25.747 回答
0

我们来看看你的正则表达式是什么意思。[A-Z0-9]表示任何大写字母或数字,{12}表示前面的表达式必须恰好出现 12 次。该字符串CONCENTRATIO是 12 个大写字母,因此 grep 选择它也就不足为奇了。如果您想取出仅与字母或数字匹配的匹配项,您可以尝试类似

allleters <- grep("[A-Z]{12}",strings)
allnumbers <-grep("[0-9]{12}",strings)
both <- grep("[A-Z0-9]{12}",strings)

你想要的比赛就像

both <- both[!both %in% union(allletters,allnumbers)]

具有更好正则表达式的人可能有更优雅的解决方案,但这也可以。

于 2013-07-23T16:05:28.883 回答