gpt4 book ai didi

r - 提取可能多次出现或根本不出现的字符串元素

转载 作者:行者123 更新时间:2023-12-04 11:32:00 26 4
gpt4 key购买 nike

从URL的字符向量开始。目标是仅以公司名称结尾,在下面的示例中,该列仅包含"test""example""sample"

urls <- c("http://grand.test.com/", "https://example.com/", 
"http://.big.time.sample.com/")

删除 ".com"及其后面的所有内容,并保留第一部分:
urls <- sapply(strsplit(urls, split="(?<=.)(?=\\.com)", perl=T), "[", 1) 

urls
# [1] "http://grand.test" "https://example" "http://.big.time.sample"

我的下一步是通过链接的 http://调用删除 https://gsub()部分:
urls <- gsub("^http://", "",  gsub("^https://", "", urls))

urls
# [1] "grand.test" "example" ".big.time.sample"

但是,这是我需要帮助的地方。如何处理网址的第一和第三字符串中公司名称之前的多个句点(点)?例如,下面的调用返回第二个字符串的NA,因为 "example"字符串没有剩余的句点。或者,如果我仅保留第一部分,则会丢失公司名称。
urls  <- sapply(strsplit(urls, split = "\\."), "[", 2)
urls
# [1] "test" NA "big"

urls <- sapply(strsplit(urls, split = "\\."), "[", 1)
urls
# [1] "grand" "example" ""

也许是 ifelse()调用,它计算剩余的周期数,并且仅在存在多个周期时才使用strsplit?另请注意,公司名称前可能有两个或多个句点。我不知道该如何解决问题,这可能会解决我的问题。但这不是
strsplit(urls, split="(?=\\.)", perl=T)

感谢您的任何建议。

最佳答案

这是一种比其他方法更容易理解和概括的方法:

pat = "(.*?)(\\w+)(\\.com.*)"
gsub(pat, "\\2", urls)

它的工作原理是将每个字符串分成三个与整个字符串匹配的捕获组,然后替换为仅捕获组 (2),即所需的捕获组。
pat = "(.*?)(\\w+)(\\.com.*)"
# ^ ^ ^
# | | |
# (1) (2) (3)

编辑(添加?修饰符的说明):

请注意,捕获组 (1)需要包括“ungreedy”或“minimum”量词 ?( also sometimes called "lazy" or "reluctant")。它从本质上告诉正则表达式引擎匹配尽可能多的字符...而不会用尽任何字符,否则这些字符可能会成为以下捕获组 (2)的一部分。

如果没有尾随 ?,则默认情况下,重复量词为greedy。在这种情况下,贪婪的捕获组 (.*)会匹配字符串中的所有字符,因此它会“吃掉”字符串中的所有字符,而剩下的两个捕获组则完全没有,这是贪婪的捕获组–这不是我们想要的行为!

关于r - 提取可能多次出现或根本不出现的字符串元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24316885/

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