我在 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."
我正在尝试从以下文本中提取标签、名称、地址、城市、邮编和距离:
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."