2016-03-11 65 views
1

我有一个数据框,其中包含一列文本。我需要捕捉某个短语后面的数字(可能是最可能的1到4位数字的任意位数),即'楼层面积''楼面面积'。我的数据看起来类似以下内容:在R中提取特定文本中的一个数字

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

如果我尝试只提取次数,或者我从平方米回头我有时会得到通过mistake.If人的很多区域可以帮我一个超前的正则表达式或在stringr类似,我会很感激。正则表达式对我来说是一个弱点。提前谢谢了。

+0

为什么要使用前瞻/后视?使用stringr'str_match(df,“(?i)\\ bfloor area:?\\ s *(\\ d +)\\ s * sq”)'并获得第二列值('[,2]'): '> str_match(v,“(?i)\\ bfloor area:?\\ s *(\\ d +)\\ s * sq“)[,2] // [1]”50“”30“”50“' –

回答

3

我建议使用的捕获机制10从stringr并获得第二列的值([,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") 
> str_match(v, "(?i)\\bfloor area:?\\s*(\\d+)\\s*sq")[,2] 
[1] "50" "30" "50" 

正则表达式匹配:

  • (?i) - 在不区分大小写的方式
  • \\bfloor area:? - 一个全字(\b是一个字边界)floor area后跟一个可选:(一个或零次出现,?
  • \\s* - 零个或多个空白
  • (\\d+) - 第1组(将在[,2])捕获一个或多个数字
  • \\s*sq - 零个或多个空白符号(\s*),接着用sq(删除如果不是必要的或根据需要进行调整)。
+1

这很棒。谢谢,并感谢您的亲切,详细的解释! – RichS

0

你需要lookbehind正则表达式。

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

str_extract_all(x, "(?i)\\bfloor area:?\\s*\\K\\d+", perl=T) 

DEMO

唐诺为什么上面的代码不会返回任何东西。您可以尝试sub

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

'perl'不是'str_extract_all –

+0

因此,在st_extract_all中不需要perl arg? –

+0

对于'perl = TRUE'说'未使用的参数'并且不使用perl它只是显示'character(0)' – RichS

0

下面的正则表达式可以让你开始:

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

The DEMO.

0

使用下面的正则表达式与不区分大小写的匹配:

floor\s*area:?\s*(\d{1,4}) 
0
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 

希望这有助于。