[英]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.