R中2个逗号之间文本数据的正则表达式提取
Regex extraction of text data between 2 commas in R
我在数据框 (df) 中有一堆文本,通常在 1 列中包含三行地址,我的目标是提取地区(文本的中心部分),例如:
73 Greenhill Gardens, Wandsworth, London
22 Acacia Heights, Lambeth, London
对我来说幸运的是,在 95% 的情况下,输入数据的人使用逗号分隔我想要的文本,其中 100% 的时间以“, London”结尾(即逗号 space London)。 为了清楚地说明事情,我的目标是提取“, London”之前和逗号之后的文本
我想要的输出是:
Wandsworth
Lambeth
我可以设法提取之前的部分:
df$extraction <- sub('.*,\s*','',address)
及之后
df$extraction <- sub('.*,\s*','',address)
但不是我需要的中间部分。有人可以帮忙吗?
非常感谢!
您可以省去正则表达式的麻烦,将矢量视为 CSV,使用文件读取功能提取相关部分。我们可以使用 read.csv()
,利用 colClasses
可用于删除列的事实。
address <- c(
"73 Greenhill Gardens, Wandsworth, London",
"22 Acacia Heights, Lambeth, London"
)
read.csv(text = address, colClasses = c("NULL", "character", "NULL"),
header = FALSE, strip.white = TRUE)[[1L]]
# [1] "Wandsworth" "Lambeth"
或者我们可以使用 fread()
。它的 select
参数很好,它会自动去除白色 space。
data.table::fread(paste(address, collapse = "\n"),
select = 2, header = FALSE)[[1L]]
# [1] "Wandsworth" "Lambeth"
这里有一些方法:
# target ", London" and the start of the string
# up until the first comma followed by a space,
# and replace with ""
gsub("^.+?, |, London", "", address)
#[1] "Wandsworth" "Lambeth"
或
# target the whole string, but use a capture group
# for the text before ", London" and after the first comma.
# replace the string with the captured group.
sub(".+, (.*), London", "\1", address)
#[1] "Wandsworth" "Lambeth"
你可以试试这个
(?<=, )(.+?),
适用于任何数据集位置不必在伦敦。
这里有两个不依赖于相同城市名称的选项。第一个使用 stringr::str_extract()
:
的正则表达式模式
raw_address <- c(
"73 Greenhill Gardens, Wandsworth, London",
"22 Acacia Heights, Lambeth, London",
"Street, District, City"
)
df <- data.frame(raw_address, stringsAsFactors = FALSE)
df$distict = stringr::str_extract(raw_address, '(?<=,)[^,]+(?=,)')
> df
raw_address distict
1 73 Greenhill Gardens, Wandsworth, London Wandsworth
2 22 Acacia Heights, Lambeth, London Lambeth
3 Street, District, City District
第二个使用 strsplit()
并使获取地址的其他元素更容易:
df$address <- sapply(strsplit(raw_address, ',\s*'), `[`, 1)
df$distict <- sapply(strsplit(raw_address, ',\s*'), `[`, 2)
df$city <- sapply(strsplit(raw_address, ',\s*'), `[`, 3)
> df
raw_address address distict city
1 73 Greenhill Gardens, Wandsworth, London 73 Greenhill Gardens Wandsworth London
2 22 Acacia Heights, Lambeth, London 22 Acacia Heights Lambeth London
3 Street, District, City Street District City
拆分在 ,\s*
上完成,以防没有 space 或逗号后有多个 space。
我在数据框 (df) 中有一堆文本,通常在 1 列中包含三行地址,我的目标是提取地区(文本的中心部分),例如:
73 Greenhill Gardens, Wandsworth, London
22 Acacia Heights, Lambeth, London
对我来说幸运的是,在 95% 的情况下,输入数据的人使用逗号分隔我想要的文本,其中 100% 的时间以“, London”结尾(即逗号 space London)。 为了清楚地说明事情,我的目标是提取“, London”之前和逗号之后的文本
我想要的输出是:
Wandsworth
Lambeth
我可以设法提取之前的部分:
df$extraction <- sub('.*,\s*','',address)
及之后
df$extraction <- sub('.*,\s*','',address)
但不是我需要的中间部分。有人可以帮忙吗?
非常感谢!
您可以省去正则表达式的麻烦,将矢量视为 CSV,使用文件读取功能提取相关部分。我们可以使用 read.csv()
,利用 colClasses
可用于删除列的事实。
address <- c(
"73 Greenhill Gardens, Wandsworth, London",
"22 Acacia Heights, Lambeth, London"
)
read.csv(text = address, colClasses = c("NULL", "character", "NULL"),
header = FALSE, strip.white = TRUE)[[1L]]
# [1] "Wandsworth" "Lambeth"
或者我们可以使用 fread()
。它的 select
参数很好,它会自动去除白色 space。
data.table::fread(paste(address, collapse = "\n"),
select = 2, header = FALSE)[[1L]]
# [1] "Wandsworth" "Lambeth"
这里有一些方法:
# target ", London" and the start of the string
# up until the first comma followed by a space,
# and replace with ""
gsub("^.+?, |, London", "", address)
#[1] "Wandsworth" "Lambeth"
或
# target the whole string, but use a capture group
# for the text before ", London" and after the first comma.
# replace the string with the captured group.
sub(".+, (.*), London", "\1", address)
#[1] "Wandsworth" "Lambeth"
你可以试试这个
(?<=, )(.+?),
适用于任何数据集位置不必在伦敦。
这里有两个不依赖于相同城市名称的选项。第一个使用 stringr::str_extract()
:
raw_address <- c(
"73 Greenhill Gardens, Wandsworth, London",
"22 Acacia Heights, Lambeth, London",
"Street, District, City"
)
df <- data.frame(raw_address, stringsAsFactors = FALSE)
df$distict = stringr::str_extract(raw_address, '(?<=,)[^,]+(?=,)')
> df
raw_address distict
1 73 Greenhill Gardens, Wandsworth, London Wandsworth
2 22 Acacia Heights, Lambeth, London Lambeth
3 Street, District, City District
第二个使用 strsplit()
并使获取地址的其他元素更容易:
df$address <- sapply(strsplit(raw_address, ',\s*'), `[`, 1)
df$distict <- sapply(strsplit(raw_address, ',\s*'), `[`, 2)
df$city <- sapply(strsplit(raw_address, ',\s*'), `[`, 3)
> df
raw_address address distict city
1 73 Greenhill Gardens, Wandsworth, London 73 Greenhill Gardens Wandsworth London
2 22 Acacia Heights, Lambeth, London 22 Acacia Heights Lambeth London
3 Street, District, City Street District City
拆分在 ,\s*
上完成,以防没有 space 或逗号后有多个 space。