簡體   English   中英

R gsub和regex查找價格

[英]R gsub & regex find price

我正在嘗試根據給定的文本創建新的價格向量。 我只被允許使用gsub

test = c('Testing $26,500\ntesting', 
         'Testing tesing $79+\n TOTAL: $79200', 
         'Testing $3880. Testing', 
         'Testing -$69000Engine: $69000100%',
         'Testing testing original price : $ 8 2 9 5 . Real price is $ 7 4 9 5')

所需輸出:

# [1] 26500 79200  3880 69000  7495

我嘗試了多個正則表達式,但無法獲得正確的結果。

第一次嘗試:

gsub(".*\\$(\\d+)[,|.](\\d+).*", "\\1\\2", test)
# [1] "26500"                                                               
# [2] "Testing tesing $79+\n TOTAL: $79200"                                 
# [3] "Testing $3880. Testing"                                              
# [4] "Testing -$69000Engine: $69000100%"                                   
# [5] "Testing testing original price : $ 8 2 9 5 . Real price is $ 7 4 9 5"

第二次嘗試:

gsub(".*\\$(\\d+)[,|.].*", "\\1", test) 
# [1] "26"                                                                  
# [2] "Testing tesing $79+\n TOTAL: $79200"                                 
# [3] "3880"                                                                
# [4] "Testing -$69000Engine: $69000100%"                                   
# [5] "Testing testing original price : $ 8 2 9 5 . Real price is $ 7 4 9 5"

第三次嘗試:

gsub("(?:.*|.*?*)\\$([0-9]+).*", "\\1", test) 
# [1] "26"                                                                  
# [2] "79200"                                                               
# [3] "3880"                                                                
# [4] "69000100"                                                            
# [5] "Testing testing original price : $ 8 2 9 5 . Real price is $ 7 4 9 5"

第四次嘗試:

gsub(".*[-]\\$(\\d+).*", "\\1", test) 
# [1] "Testing $26,500\ntesting"                                            
# [2] "Testing tesing $79+\n TOTAL: $79200"                                 
# [3] "Testing $3880. Testing"                                              
# [4] "69000"                                                               
# [5] "Testing testing original price : $ 8 2 9 5 . Real price is $ 7 4 9 5"

問題 :如何解決此問題並避免使用多個gsub函數調用?

我不相信有一種方法可以只對gsub使用一次調用,因為您需要預處理最后一個價格(其中數字之間用空格“斷開”,而第一個價格用逗號十進制分隔符)。

我只能將代碼“壓縮”到2個gsub調用中:

  • gsub("([$]|(?!^)\\\\G)[\\\\s,]*(\\\\d)", "\\\\1\\\\2", test, perl=T)將刪除逗號, $符號后面的數字之間的空格
  • gsub("^(?|[\\\\s\\\\S]*-[$](\\\\d+)|[\\\\s\\\\S]*[$](\\\\d+))[\\\\s\\\\S]*$", "\\\\1", test, perl=T)實際上會從字符串中獲取所需的價格編號。

IDEONE演示

test <- c("Testing $26,500\ntesting","Testing tesing $79+\n TOTAL: $79200","Testing $3880. Testing", "Testing -$69000Engine: $69000100%","Testing testing original price : $ 8 2 9 5 . Real price is $ 7 4 9 5")
test <- gsub("([$]|(?!^)\\G)[\\s,]*(\\d)", "\\1\\2", test, perl=T)
test <- gsub("^(?|[\\s\\S]*-[$](\\d+)|[\\s\\S]*[$](\\d+))[\\s\\S]*$", "\\1", test, perl=T)
test

結果: [1] "26500" "79200" "3880" "69000" "7495"

由於您正在學習正則表達式,因此以下是正則表達式細分:

正則表達式1:

  • ([$]|(?!^)\\\\G) -匹配並捕獲$符號匹配的“前導邊界”構造,並在每次成功匹配后與(?!^)\\G\\G也匹配開頭的字符串,我們用負的前瞻(?!^)消除它
  • [\\\\s,]* -匹配0個或多個逗號或空格
  • (\\\\d) -匹配並捕獲一個數字

使用\\1\\2替換模式,我們將$符號及其后的數字還原到字符串中。

正則表達式2:

  • ^ -字符串的開頭
  • (?|[\\\\s\\\\S]*-[$](\\\\d+)|[\\\\s\\\\S]*[$](\\\\d+)) - 分支重置組(?|...|...) ),其中捕獲組索引被重置為1(因此,我們只需要在替換模式中使用\\1引用來解決兩個(\\\\d+)來自每個替代項的匹配)。
    • [\\\\s\\\\S]*-[$](\\\\d+) -任何零個或多個字符( [\\s\\S]* ),后跟一個連字符,再一個$ ,再一個1個或多個數字( \\d+ ,第1組)
    • | - 要么...
    • [\\\\s\\\\S]*[$](\\\\d+) -任何零個或多個字符( [\\s\\S]* ),后跟$ ,然后是1個或多個數字( \\d+仍為組1

然后,我們僅用\\1反向引用替換所有內容,以得到結果。 - [\\\\s\\\\S]*$ -任意字符,出現0次或更多( [\\s\\S]* ),直至字符串( $ )的末尾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM