在单词之前或之后提取数字的常用技术是匹配所有字符串,直到单词或数字或数字和单词,同时捕获数字,然后匹配字符串的其余部分并使用 sub:
替换为捕获的子字符串
# Extract the first number after a word:
as.integer(sub(".*?<WORD_OR_PATTERN_HERE>.*?(\\d+).*", "\\1", x))
# Extract the first number after a word:
as.integer(sub(".*?(\\d+)\\s*<WORD_OR_PATTERN_HERE>.*", "\\1", x))
注意:将\\d+ 替换为\\d+(?:\\.\\d+)? 以匹配整数或浮点数(为了与上面的代码保持一致,请记住将as.integer 更改为as.numeric)。 \\s* 匹配第二个 sub 中的 0 个或多个空格。
对于当前场景,可能的解决方案如下所示
v <- c("A beautiful flat on the 3rd floor with floor area: 50 sqm and a lift","Newbuild flat. Floor Area: 30 sq.m","6 bed house with floor area 50 sqm, lot area 25 sqm")
as.integer(sub("(?i).*?\\bfloor area:?\\s*(\\d+).*", "\\1", v))
# [1] 50 30 50
请参阅regex demo。
您还可以利用 stringr 中的 str_match 捕获机制并获取第二列值 ([,2]):
> library(stringr)
> v <- c("A beautiful flat on the 3rd floor with floor area: 50 sqm and a lift","Newbuild flat. Floor Area: 30 sq.m","6 bed house with floor area 50 sqm, lot area 25 sqm")
> as.integer(str_match(v, "(?i)\\bfloor area:?\\s*(\\d+)")[,2])
[1] 50 30 50
请参阅regex demo。
正则表达式匹配:
-
(?i) - 不区分大小写
-
\\bfloor area:? - 整个单词(\b 是单词边界)floor area 后跟可选的:(出现一次或零次,?)
-
\\s* - 零个或多个空格
-
(\\d+) - 第 1 组(将在 [,2] 中)捕获一位或多位数字
见R demo online