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

What is wrong with my regular expression in R?

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

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.

...
...

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

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)

我的模式有语法错误吗?

这里有一种不用正则表达式的方法

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))

也许试试 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."