Regex R gsub&;正则表达式查找价格
我试图从给定的文本中创建一个新的价格向量。我只允许使用Regex R gsub&;正则表达式查找价格,regex,r,gsub,Regex,R,Gsub,我试图从给定的文本中创建一个新的价格向量。我只允许使用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
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] "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)
test我认为没有办法只调用一次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)
将实际从字符串中获取所需的价格编号
:
test@akrun:不,这不是家庭作业。我读过这篇文章。我试着用更多的例子来验证它。因为我正在学习R中的正则表达式,所以我不想在stringr包中尝试它。你知道你可以复制/粘贴控制台而不是所有那些图片。理查德·斯克里文:很抱歉给您带来不便。我最近才习惯。但是,只有结果是屏幕截图,所有代码都在代码块中。使用gsubfn
并将proto对象传递给gsub
,这是允许的吗?您可以传递数字+标点符号,然后在$
符号后获取数字。最后一个价格是100%
,这让我有点困惑。我猜100%
是多余的?@akrun:不,这不是家庭作业。我读过这篇文章。我试着用更多的例子来验证它。因为我正在学习R中的正则表达式,所以我不想在stringr包中尝试它。你知道你可以复制/粘贴控制台而不是所有那些图片。理查德·斯克里文:很抱歉给您带来不便。我最近才习惯。但是,只有结果是屏幕截图,所有代码都在代码块中。使用gsubfn
并将proto对象传递给gsub
,这是允许的吗?您可以传递数字+标点符号,然后在$
符号后获取数字。最后一个价格是100%
,这让我有点困惑。我猜100%
是多余的?谢谢斯特里比雪夫。我正在阅读sequence define,但无法找出\\G在正则表达式1中的含义。我已将\G
描述为每次成功匹配后的位置和字符串的开头。因为我们不想在字符串的开头匹配,所以我们添加了一个负的前瞻(?!^)
。谢谢Stribizev。我正在阅读sequence define,但无法找出\\G在正则表达式1中的含义。我已将\G
描述为每次成功匹配后的位置和字符串的开头。因为我们不希望在字符串的开头匹配,所以我们添加了一个负的前瞻(?!^)
。