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

标签 r substring regex-lookarounds strsplit

从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/

相关文章:

r - Bookdown/thesisdown/huskydown : change page margins for a single page within a document

r - 如何在 R 中创建用户定义的 S4 类的数据框

ios - 区分 UILabel 的元数据时出现问题?

python - 正则表达式直到字符但如果前面没有另一个字符

regex - 我们需要 Lookahead/Lookbehind 零宽度断言做什么?

javascript - 如何匹配其他所有内容,但无论它与正则表达式匹配?

r - 如何使用 knitr 添加引用书目

r - 将自定义斜率和截距添加到 R 中的 geom_smooth

java - java中查找双引号内的子字符串

regex - SAS : How do I find nth instance of a character/group of characters within a string?