Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex R gsub&;正则表达式查找价格_Regex_R_Gsub - Fatal编程技术网

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
描述为每次成功匹配后的位置和字符串的开头。因为我们不希望在字符串的开头匹配,所以我们添加了一个负的前瞻
(?!^)