在特定文本中添加逗号和“”

时间:2017-09-12 03:45:52

标签: r regex

我不知道我的问题属于哪个类别。我的文字有如下图案。

  

1 MERRILL LYNCH 33 2 LEHMAN BROTHERS HLDGS。 82 3 SALOMON 149 4 PAINE   WEBBER GROUP 248 5 BEAR STEARNS 328 6 CHARLES SCHWAB 621 7 A.G.   EDWARDS& SONS 823

模式是(序列从1,公司名称(由字符或数字组成),数字(最多1000))重复

我想(构建一个函数)将此文本转换为向量;

c("1 MERRILL LYNCH 33", "2 LEHMAN BROTHERS HLDGS. 82", "3 SALOMON 149", 
  "4 PAINE WEBBER GROUP 248", "5 BEAR STEARNS 328", "6 CHARLES SCHWAB 621", 
  "7 A.G. EDWARDS & SONS 823")

这可能吗?公司名称或后面的数字没有规律性。在第一个增加序列之后总是有一个空格,一个公司名称之后的空格。如有必要,我可以提供更多信息。

3 个答案:

答案 0 :(得分:4)

使用stringr

library(stringr)
str_extract_all(txt, "[0-9]+\\D+[0-9]+")

正则表达式读取“任意数量的数字”,然后是“除数字之外的任何数字”,然后是“任意数量的数字”。

给出

[[1]]
[1] "1 MERRILL LYNCH 33"          "2 LEHMAN BROTHERS HLDGS. 82" "3 SALOMON 149"              
[4] "4 PAINE WEBBER GROUP 248"    "5 BEAR STEARNS 328"          "6 CHARLES SCHWAB 621"       
[7] "7 A.G. EDWARDS & SONS 823"

请注意,结果是一个列表。

答案 1 :(得分:2)

类似于@Remeko Duursma的回答,这里是基础R版本:

regmatches(txt, gregexpr("[0-9]+[^0-9]+[0-9]+", txt))[[1]]

结果:

[1] "1 MERRILL LYNCH 33"          "2 LEHMAN BROTHERS HLDGS. 82"
[3] "3 SALOMON 149"               "4 PAINE WEBBER GROUP 248"   
[5] "5 BEAR STEARNS 328"          "6 CHARLES SCHWAB 621"       
[7] "7 A.G. EDWARDS & SONS 823"

答案 2 :(得分:1)

或其他选项strsplit来自base R

strsplit(txt, "(?<=[0-9])\\s+(?=[0-9])", perl = TRUE)[[1]]
#[1] "1 MERRILL LYNCH 33"          "2 LEHMAN BROTHERS HLDGS. 82" "3 SALOMON 149" 
#[4] "4 PAINE WEBBER GROUP 248" "5 BEAR STEARNS 328"  "6 CHARLES SCHWAB 621"
#[7] "7 A.G. EDWARDS & SONS 823"  

另一个base R选项可以是gsubscan

scan(text = gsub("(\\d+) (\\d+)", "\\1,\\2", txt), what = "", sep=",", quiet = TRUE)
#[1] "1 MERRILL LYNCH 33"          "2 LEHMAN BROTHERS HLDGS. 82" "3 SALOMON 149"             
#[4] "4 PAINE WEBBER GROUP 248"  "5 BEAR STEARNS 328"   
#[6]   "6 CHARLES SCHWAB 621"        "7 A.G. EDWARDS & SONS 823"