regex - 用 R 中的正则表达式解析(可能)不存在的数字

标签 regex r

我正在尝试使用包 stringr 从 R 中的字符串中提取数字.有时,数字不存在。以下是一些示例字符串:

str <- c(
"cash dividends per share $ - $ - $ - $ 0.08 $ 0.16 cash",
"cash dividends per share $ 0.01 $ 12.10 $ 0.01 $ 0.08 $ 0.16 hello",
"cash dividends per share $ - $ - $ 0.91 $ - $ 0.16 world",
"cash dividends per share - - 0.12 - 0.16 hsac",
"cash dividends per share $ - $ - $ - $ - $ 0.16 afterwards",
"cash dividends per share $0.12 $ - $0.1 $ - $ - comes",
"cash dividends per share 0.12 - 0.12 - - text",
"cash dividends per share... 0.12 - 0.12 - - random",
"cash dividends per share...0.123 0.321 - - 0.12 blu",
"cash dividends per share ..... $ 0.12 $ - $ 0.12  $ - $ - foo",
"cash dividends per share ..... $0.42 $0.42 $-  $- $- bar")

我构建了以下正则表达式,IMO 应该匹配所有情况,但事实并非如此。当然,我也尝试了各种不同的,但我无法找出正确的一个(我什至看不到我想出的问题):
library("stringr")
rgxp <- "cash dividends [declared]* per share[ \\.]+[\\$]?[ ]?([-0.9\\.]+)[ ]?[\\$]?[ ]?([-0.9\\.]+)[ ]?[\\$]?[ ]?([-0.9\\.]+)[ ]?[\\$]?[ ]?([-0.9\\.]+)[ ]?[\\$]?[ ]?([-0.9\\.]+).*"
str_match_all(str, rgxp)

您是否看到上述正则表达式失败的任何问题?

编辑:我应该说我想要的输出总是一个包含五个元素的向量,即数字或连字符(如果没有数字)。谢谢!

最佳答案

使用 gsub用空格替换任何两个或多个连续点和任何非减号、数字或点的字符,然后使用 read.table 读入.省略 na.strings = "-"如果您希望减号出现在 NA 所在的位置。不使用任何包。

DF <- read.table(text = gsub("[^-0-9.]+|\\.{2,}", " ", str), fill = TRUE, na.strings = "-")

给出这个 data.frame:
> DF
      V1     V2   V3   V4   V5
1     NA     NA   NA 0.08 0.16
2  0.010 12.100 0.01 0.08 0.16
3     NA     NA 0.91   NA 0.16
4     NA     NA 0.12   NA 0.16
5     NA     NA   NA   NA 0.16
6  0.120     NA 0.10   NA   NA
7  0.120     NA 0.12   NA   NA
8  0.120     NA 0.12   NA   NA
9  0.123  0.321   NA   NA 0.12
10 0.120     NA 0.12   NA   NA
11 0.420  0.420   NA   NA   NA

注:如果您想用零替换 NA,请使用:DF[is.na(DF)] <- 0 .

关于regex - 用 R 中的正则表达式解析(可能)不存在的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34250884/

相关文章:

python - 如何从数据帧中删除行,其中字段仅包含破折号/连字符(-),而不影响python中的负值

r - 将图例添加到 ggtree (ggplot) R

r - pander 中的表格,样式 ="multiline"

java - 包 java.util.regex 不存在(代号one)

正则表达式排除查找工具的单词

java - 为什么 Matcher 找不到模式

r - 在 R 中一次循环 10 列

r - 是否有 R 函数根据最接近的给定值对数据帧进行排序?

r - sendmailR : how to handle occasional “Unknown SMTP code” errors

Javascript正则表达式 - 获取[此处的内容]之后的所有文本