Regex 提取R中特定文本后面的数字

Regex 提取R中特定文本后面的数字,regex,r,stringr,Regex,R,Stringr,我有一个数据框,其中包含一列完整的文本。我需要捕获某个短语后面的数字(可能是长度最有可能为1到4位的任意数字),即'Floor Area'或'Floor Area'。我的数据如下所示: "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

我有一个数据框,其中包含一列完整的文本。我需要捕获某个短语后面的数字(可能是长度最有可能为1到4位的任意数字),即'Floor Area''Floor Area'。我的数据如下所示:

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

如果我试图只提取数字,或者如果我从sqm中回过头来看,我有时会错误地获取地块面积。如果有人能帮助我在stringr中使用前瞻性正则表达式或类似的正则表达式,我将不胜感激。正则表达式对我来说是个弱点。非常感谢。您需要lookback regex

str_extract_all(x, "\\b[Ff]loor [Aa]rea:?\\s*\\K\\d+", perl=T)

Donno为什么上面的代码不会返回任何内容。您也可以尝试
sub

> sub(".*\\b[Ff]loor\\s+[Aa]rea:?\\s*(\\d+).*", "\\1", x)
[1] "50" "30" "50"

以下正则表达式可能会帮助您开始:

[Ff]loor\s+[Aa]rea:?\s+(\d{1,4})

将以下正则表达式与不区分大小写的匹配一起使用:

floor\s*area:?\s*(\d{1,4})

提取单词前后的数字的常用技术是在捕获数字时将所有字符串与单词或数字或数字和单词匹配,然后匹配字符串的其余部分,并使用
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))

您还可以利用stringr中带有
stru match
的捕获机制,获取第二列值(
[,2]
):

>库(stringr)
>v为整数(str_匹配(v,“(?i)\\b地板面积:?\\s*(\\d+))[,2])
[1] 50 30 50

正则表达式匹配:

  • (?i)
    -不区分大小写
  • \\b地板面积:?
    -一个完整的单词(
    \b
    是一个单词边界)
    地板面积
    ,后跟一个可选的
    (出现一次或零次,
  • \\s*
    -零个或多个空格
  • (\\d+
    )-组1(将在
    [,2]
    中)捕获一个或多个数字

请参见
text
perl
不是
str_extract_all()
的参数,因此,st_extract_all中不需要perl arg?因为“perl=TRUE”表示“未使用的参数”,而不使用perl,它只显示“character(0)”@AvinashRaj:最新版本的
stringr
使用ICU正则表达式库:它不支持
\K
。是谁干的?准备用腐烂的鱼打stringr包的开发者。这太棒了。非常感谢,感谢您的友好、详细的解释!要捕获小数,可以将
(\\d+)
替换为
(\\d+(?:.\\d+)
,只需记住将
更改为.integer
,将
更改为.numeric
# 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))
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
> 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
text<- "A beautiful flat on the 3rd floor with floor area: 50 sqm and a lift"

unique(na.omit(as.numeric(unlist(strsplit(unlist(text), "[^0-9]+")))))
# [1]  3 50