我正在抓取PDF数据,并尝试搜索长度为1或2的数字字符(1:9)。不幸的是,我在改变PDF位置后的取值使我无法简单地调用索引值并将其分配给变量。
我尝试了许多正则表达式函数,可以将数字从列表中删除,但似乎无法实现仅提取特定长度数字的参数。
# Data comes in as a long string
Test<-("82026-424 82026-424 1 CSX10 Store Room 75.74 75.74")
# Seperate data into individual pieces with str_split
Split_Test<-str_split(Test[1],"\\s+")
# We can easily unlist it with the following code (Not sure if needed)
Test_Unlisted<-unlist(Split_Test)
> Test_Unlisted
[1] "82026-424" "82026-424" "1" "CSX10" "Store" "Room"
[8] "75.74" "75.74"
我希望得到的结果是将“ 1”从字符列表中删除,然后如果该值为“ 20”,则也可以识别该字符。
我在代码中想到的最佳逻辑存在于下面,但这不起作用。
Test_Final<-str_match(Test_Unlisted, "\\d|\\d\\d")
使用此代码,我可以抓取任何length = 1的东西,但不能保证它是字符:
Test_Final<-which(sapply(Test_Unlisted, nchar)==1)
感谢所有帮助!
答案 0 :(得分:1)
您需要使用
Test<-("82026-424 82026-424 1 CSX10 Store Room 75.74 75.74, 20")
regmatches(Test, gregexpr("\\b(?<!\\d\\.)\\d{1,2}\\b(?!\\.\\d)", Test, perl=TRUE))
请参见regex demo和regex demo。
详细信息
\b
-单词边界(?<!\d\.)
-如果在当前位置的左侧紧挨着一个数字和一个点,则向后的否定查找将使匹配失败。\d{1,2}
-1或2位数字\b
-单词边界(?!\.\d)
-如果在当前位置的右侧紧邻有一个点和一个数字,则负匹配将使匹配失败。请注意,由于该模式中使用了环顾四周,因此应将正则表达式传递给PCRE正则表达式引擎,因此需要perl=TRUE
参数。
使用stringr
(由ICU regex引擎提供动力),您可以使用
library(stringr)
str_extract_all(Test, "\\b(?<!\\d\\.)\\d{1,2}\\b(?!\\.\\d)")