首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么模式适用于str_extract_all,而不适用于strsplit或str_subset?

为什么模式适用于str_extract_all,而不适用于strsplit或str_subset?
EN

Stack Overflow用户
提问于 2021-09-19 14:29:51
回答 2查看 106关注 0票数 3

这是我的数据,一个字符串:

代码语言:javascript
复制
data <- "Mr. NAME. Content1.Mrs. NAMEE. Content2.Ms. NAME ABCD. Content3."

我通过下面的语法得到了一个名称向量:

代码语言:javascript
复制
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先生”“沃瑟曼·舒尔茨女士”“索托先生”“沃瑟曼·舒尔茨女士”

我怎样才能得到名字之间内容的向量。我想要一个这样的向量:

代码语言:javascript
复制
"Content1."   "Content2."    "Content3."

我尝试了str_subset和strsplit来获取我在str_extract函数中定义的模式之间的内容,失败了一次又一次.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-19 17:24:38

您真的可以在stringr::str_split中使用正则表达式。然而,将替代方案浓缩为

代码语言:javascript
复制
pattern <- "\\bM(?:rs?|s)\\.\\s\\p{Lu}{1,20}\\s?\\p{Lu}{1,20}\\."

MsMrMrs可以加入到M(?:rs?|s)模式中(M,然后是r和可选的s,或者仅仅是s)。

现在,您可以在stringr::str_split中使用此模式。

代码语言:javascript
复制
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."

为什么一开始有一个空字符串?它之所以存在,是因为字符串的开头有一个匹配项。分割时,从字符序列中删除匹配的文本,并将前后文本放入单独的项中。当匹配开始时,第一项是空字符串。当匹配位于字符串的末尾或有连续的匹配时,也会发生同样的情况。

如果不希望输出中有空项,只需删除它们:

代码语言:javascript
复制
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."
票数 3
EN

Stack Overflow用户

发布于 2021-09-19 14:49:56

获得所需结果的一个简单方法是使用string_replace_all将正则表达式折叠为令牌,然后按该令牌拆分:

代码语言:javascript
复制
#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")

产量

代码语言:javascript
复制
""           " Content1." " Content2." " Content3."
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69244171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档