Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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
R 行不完全相等的正则表达式模式问题_R_Regex - Fatal编程技术网

R 行不完全相等的正则表达式模式问题

R 行不完全相等的正则表达式模式问题,r,regex,R,Regex,我在从pdf下载和提取表格时遇到问题。目前,我正处于提取“contents”表的阶段,我将使用该表作为文档其余部分的索引。我的问题是表中有三列格式为一个字符串,有些列在第一列和第二列之间有一个空格,有些列有两个或更多。我应该使用哪个正则表达式模式 例如: a <- "15 Aguascalientes - Ent. Cd. de Los Niños AGS" b <- "3 Aguascalie

我在从pdf下载和提取表格时遇到问题。目前,我正处于提取“contents”表的阶段,我将使用该表作为文档其余部分的索引。我的问题是表中有三列格式为一个字符串,有些列在第一列和第二列之间有一个空格,有些列有两个或更多。我应该使用哪个正则表达式模式

例如:

a <- "15 Aguascalientes - Ent. Cd. de Los Niños                             AGS"
b <- "3   Aguascalientes - Zacatecas                                       MEX-045"
str_split_fixed(a, "\\s{2,}", n = 3)
str_split_fixed(b, "\\s{2,}", n = 3)

a您可以使用
stringr::str_match
捕获您需要的每个零件:

库(stringr)
x[1,]“15”Aguascalientes-Ent.Cd.de Los Niños“AGS”
#=>[2,]3“Aguascalientes-Zacatecas”MEX-045
请参阅和。正则表达式详细信息:

  • ^
    -字符串开始
  • (\d+)
    -第1组:一个或多个数字
  • \s+
    -一个或多个空格
  • (.*)
    -第2组:除换行符以外的任何零个或多个字符,尽可能少
  • \s+
    -一个或多个空格
  • (\S+)
    -组3:一个或多个非空白字符
  • $
    -字符串结束

使用
str_split
我们可以指定一个OR(
)条件,以在一个数字后的一个或多个空格(
\\s+
)进行拆分,除了OP的正则表达式在多个空格字符处进行拆分外

library(stringr)
str_split(c(a, b), '(?<=\\d)\\s+|\\s{2,}')

假设OP需要一个三列data.frame,我们可以用公共分隔符
替换这些空格,并在
base R
中用
read.csv
读取这些空格(确保列类型正确)


read.csv(text=gsub((?
str\u split\u fixed
替换文本,而不是正则表达式。谢谢,这很有效。
#[[1]]
[1] "15"                                     "Aguascalientes - Ent. Cd. de Los Niños" "AGS"                                   

#[[2]]
[1] "3"                          "Aguascalientes - Zacatecas" "MEX-045"    
read.csv(text = gsub("(?<=\\d)\\s+|\\s{2,}", ",", c(a, b), 
       perl = TRUE), header = FALSE)
#  V1                                     V2      V3
#1 15 Aguascalientes - Ent. Cd. de Los Niños     AGS
#2  3             Aguascalientes - Zacatecas MEX-045