这是我的数据,一个字符串:
data <- "Mr. NAME. Content1.Mrs. NAMEE. Content2.Ms. NAME ABCD. Content3."我通过下面的语法得到了一个名称向量:
name <- unlist(str_extract_all( text, "Mr\\.\\s[:upper:]{1,20}\\s?[:upper:]{1,20}\\.|Ms\\.\\s[:upper:]{1,20}\\s?[:upper:]{1,20}\\.|Mrs\\.\\s[:upper:]{1,20}\\s?[:upper:]{1,20}\\." ))我得到了我想要的:
名为1“布克先生”“科默先生”“贝尔德先生”“柯克帕特里克太太”
5“CORTEZ MASTO女士”“罗森女士”“海耶斯太太”“SHALALA女士”
9“DEUTCH先生”“肯尼迪先生”“克里希纳莫托西先生”“索托先生”
13“SOTO先生”“戴明斯太太”“索托先生”“西西林先生”
17“SOTO先生”“沃瑟曼·舒尔茨女士”“索托先生”“沃瑟曼·舒尔茨女士”
我怎样才能得到名字之间内容的向量。我想要一个这样的向量:
"Content1." "Content2." "Content3."我尝试了str_subset和strsplit来获取我在str_extract函数中定义的模式之间的内容,失败了一次又一次.
发布于 2021-09-19 17:24:38
您真的可以在stringr::str_split中使用正则表达式。然而,将替代方案浓缩为
pattern <- "\\bM(?:rs?|s)\\.\\s\\p{Lu}{1,20}\\s?\\p{Lu}{1,20}\\."Ms、Mr和Mrs可以加入到M(?:rs?|s)模式中(M,然后是r和可选的s,或者仅仅是s)。
现在,您可以在stringr::str_split中使用此模式。
pattern <- "\\bM(?:rs?|s)\\.\\s\\p{Lu}{1,20}\\s?\\p{Lu}{1,20}\\."
library(stringr)
str_split(data,pattern)
# => [[1]]
# [1] "" " Content1." " Content2." " Content3."为什么一开始有一个空字符串?它之所以存在,是因为字符串的开头有一个匹配项。分割时,从字符序列中删除匹配的文本,并将前后文本放入单独的项中。当匹配开始时,第一项是空字符串。当匹配位于字符串的末尾或有连续的匹配时,也会发生同样的情况。
如果不希望输出中有空项,只需删除它们:
pattern <- "\\bM(?:rs?|s)\\.\\s\\p{Lu}{1,20}\\s?\\p{Lu}{1,20}\\."
library(stringr)
result <- str_split(data,pattern)
lapply(result, function(x) x[x!=""])
# => [[1]]
# [1] " Content1." " Content2." " Content3."发布于 2021-09-19 14:49:56
获得所需结果的一个简单方法是使用string_replace_all将正则表达式折叠为令牌,然后按该令牌拆分:
#Dropping many alternative patterns,
pattern = "Mr\\.\\s[:upper:]{1,20}\\s?[:upper:]{1,20}\\." #etc etc
name <- unlist(stringr::str_replace_all( data, pattern, "xyx"))
stringr::str_split(name, "xyx")产量
"" " Content1." " Content2." " Content3."https://stackoverflow.com/questions/69244171
复制相似问题