我在R中的正则表达式出了什么问题?

时间:2015-11-01 21:08:11

标签: regex r stringr

我正在尝试从以下文字中提取标签,名称,地址,城市,邮编和距离:

A

Carl's Jr.

308 WESTWOOD PLAZA

LOS ANGELES, CA 90095-8355

0.0 mi.

B

Carl's Jr.

2727 SANTA MONICA

SANTA MONICA, CA 90404-2407

4.8 mi.

...
...

这是我的正则表达式模式和代码,但我得到了一个N​​A值矩阵。

p <- "(^[AZ]\\n)^(\\w+.\\w+\\s\\w+.\\s*\\w*)\\n^(\\d+\\w+\\s*\\w*\\s*\\w*)\\n^(\\w+\\s*\\w*),\\s(CA)\\s(\\d+-*\\d*)\\n^(\\d+.\\d*)\\smi."

matches <- str_match(cj, p)

我的模式中是否存在语法错误?

2 个答案:

答案 0 :(得分:1)

也许尝试strsplit()。有关下面使用的正则表达式的说明,请参阅regex101。之后,我们可以通过查找单个字符元素的数量来计算出有多少行。

s <- strsplit(x, "\n+|, | (?=[0-9]+)", perl = TRUE)[[1]]
as.data.frame(matrix(s, sum(nchar(s) == 1), byrow = TRUE))
#   V1         V2                 V3           V4 V5         V6      V7
# 1  A Carl's Jr. 308 WESTWOOD PLAZA  LOS ANGELES CA 90095-8355 0.0 mi.
# 2  B Carl's Jr.  2727 SANTA MONICA SANTA MONICA CA 90404-2407 4.8 mi.

数据:

x <- "A\n\nCarl's Jr.\n\n308 WESTWOOD PLAZA\n\nLOS ANGELES, CA 90095-8355\n\n0.0 mi.\n\nB\n\nCarl's Jr.\n\n2727 SANTA MONICA\n\nSANTA MONICA, CA 90404-2407\n\n4.8 mi."

答案 1 :(得分:0)

这是一种没有正则表达式的方法

library(dplyr)
library(tidyr)

text =
"A

Carl's Jr.

308 WESTWOOD PLAZA

LOS ANGELES, CA 90095-8355

0.0 mi.

B

Carl's Jr.

2727 SANTA MONICA

SANTA MONICA, CA 90404-2407

4.8 mi." %>% textConnection %>% readLines

result = 
  data_frame(text = text) %>%
  filter(text != "") %>%
  mutate(type = c("ID", "name", "street_address", "city_state_zip", "distance") %>%
           rep_len(n()),
         index = ceiling((1:n())/5)) %>%
  spread(type, text) %>%
  separate(city_state_zip, c("city", "state_zip"), sep = ", " ) %>%
  separate(state_zip, c("state", "zip"), sep = " ") %>%
  separate(distance, c("distance", "unit"), sep = " ") %>%
  mutate(distance = as.numeric(distance))