gpt4 book ai didi

r - 为什么模式适用于 str_extract_all 但不适用于 strsplit 或 str_subset?

转载 作者:行者123 更新时间:2023-12-04 13:06:25 26 4
gpt4 key购买 nike

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

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}\\." ))

我得到了我想要的:

name[1] "Mr. BOOKER." "Mr. COMER." "Mr. BAIRD." "Mrs. KIRKPATRICK."
[5] "Ms. CORTEZ MASTO." "Ms. ROSEN." "Mrs. HAYES." "Ms. SHALALA."
[9] "Mr. DEUTCH." "Mr. KENNEDY." "Mr. KRISHNAMOORTHI." "Mr. SOTO."
[13] "Mr. SOTO." "Mrs. DEMINGS." "Mr. SOTO." "Mr. CICILLINE."
[17] "Mr. SOTO." "Ms. WASSERMAN SCHULTZ." "Mr. SOTO." "Ms. WASSERMAN SCHULTZ."

如何获取名称之间内容的向量。我想要这样的矢量:

"Content1."   "Content2."    "Content3."

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

最佳答案

您真的可以将正则表达式与 stringr::str_split 一起使用。然而,将备选方案压缩成

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 一起使用:

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."

关于r - 为什么模式适用于 str_extract_all 但不适用于 strsplit 或 str_subset?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69244171/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com