2016-03-11 126 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 

希望這有助於。