【发布时间】:2015-05-03 19:37:48
【问题描述】:
我试图回答一个我认为是关于提取科学记数法的文本表示的问题(后来被删除)。 (使用 R 的正则表达式实现需要对元字符进行双重转义,并且可以在纯 PCRE 或 Perl 模式下使用,我不太了解它们之间的区别。)我已经解决了大部分任务,但似乎仍然未能在捕获组中捕获前导减号。我似乎让它成功的唯一方法是使用前导左括号:
> txt <- c("this is some random text (2.22222222e-200)", "other random (3.33333e4)", "yet a third(-1.33333e-40)", 'and a fourth w/o the "e" (2.22222222-200)')
> sub("^(.+\\()([-+]{0,1}[0-9][.][0-9]{1,16}[eE]*[-+]*[0-9]{0,3})(.+$)", "\\2" ,txt)
[1] "2.22222222e-200" "3.33333e4" "-1.33333e-40" "2.22222222-200"
> sub("^(.+\\()([-+]?[0-9][.][0-9]{1,16}[eE]*[-+]*[0-9]{0,3})(.+$)", "\\2" ,txt)
[1] "2.22222222e-200" "3.33333e4" "-1.33333e-40" "2.22222222-200"
#but that seems to be "cheating" ... my failures follow:
> sub("^(.+)([-+]?[0-9][.][0-9]{1,16}[eE]*[-+]*[0-9]{0,3})(.+$)", "\\2" ,txt)
[1] "2.22222222e-200" "3.33333e4" "1.33333e-40" "2.22222222-200"
> sub("^(.+)(-?[0-9][.][0-9]{1,16}[eE]*[-+]*[0-9]{0,3})(.+$)", "\\2" ,txt)
[1] "2.22222222e-200" "3.33333e4" "1.33333e-40" "2.22222222-200"
> sub("^(.+)(-*[0-9][.][0-9]{1,16}[eE]*[-+]*[0-9]{0,3})(.+$)", "\\2" ,txt)
[1] "2.22222222e-200" "3.33333e4" "1.33333e-40" "2.22222222-200"
我已经在耐心的范围内搜索了诸如“科学记数法正则表达式减号”之类的术语
【问题讨论】:
-
您能否更新您的问题以清楚地显示起始输入和所需输出?
-
该问题使用 R 代码创建输入字符向量作为输入,我发布了两个正确答案,它们依赖于我称之为“作弊”的方法。我不知道它怎么能更可复制
-
@TimBiegeleisen 在最后三个
"1.33333e-40"不同 -
谢谢...我现在知道了 ^ ^
-
使用
str_extract_all似乎可以工作unlist(str_extract_all(txt, '-?[0-9.]+e?[-+]?[0-9]*'))
标签: regex r scientific-notation