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



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

使用此代码,我可以获取长度= 1的任何内容,但不能保证它是一个字符:

Test_Final<-which(sapply(Test_Unlisted, nchar)==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))

请参阅正则表达式演示和正则表达式演示。

  • b- 单词边界
  • (?<!d.)- 如果当前位置的左侧有一个数字和一个点,则匹配失败的负回溯
  • d{1,2}- 1 或 2 位数字
  • b- 单词边界
  • (?!.d)- 如果当前位置的右侧有一个点和一个数字,则匹配失败的负前瞻。

请注意,由于模式中使用的环顾,正则表达式应传递给 PCRE 正则表达式引擎,因此需要perl=TRUE参数。

使用由 ICU 正则表达式引擎驱动的stringr,您可以使用

library(stringr)
str_extract_all(Test, "\b(?<!\d\.)\d{1,2}\b(?!\.\d)")

最新更新