在一份文件中,我试图查找包含字母和数字的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”
上面的表达有什么问题?知道我在这里做错了吗?
以下是一些示例输入: 这里描述的每个设计目标都非常重要,但它只是实现成功项目所需要的一个方面。
一个成功的项目是在早期识别项目目标并且所有建筑系统的相互依赖性从规划和编程阶段同时协调的项目。
浓度:
必须理解,评估和适当应用设计目标的集中区域:可访问,美观,成本效益,功能/操作,历史保护,生产,安全/可靠和可持续以及它们之间的相互关系。
这些设计目标中的每一个都在设计目标文件编号中提供。 &GT; PXB111X2206。 &GT;
谢谢&amp;问候, 西马克
答案 0 :(得分: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。
答案 1 :(得分: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)]
具有更好regexfu的人可能会有一个更优雅的解决方案,但这也会有效。