从字符列表中提取长度为(1 | 2)的数字字符

时间:2018-09-12 18:16:06

标签: r regex

我正在抓取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)

感谢所有帮助!

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 demoregex 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)")