繁体   English   中英

R正则表达式在数据帧列中第二次出现/后删除所有内容

[英]R regex to remove anything after second occurance of / in data frame column

我将数据存储在如下所示的dataframe列中:

/travel
/food and drink/restaurants
/food and drink
/sports/outdoors/climbing

/news
/family

每行都有一些“ /”,但它们始终以“ /”开头。 有些行也是空白的。 我只需要将此数据转换为仅在第一个“ /”之后但在第二个“ /”之前包含文本。 我还想将结果中每个单词的首字母大写。 所以我希望结果看起来像这样:

Travel
Food And Drink
Food And Drink
Sports

News
Family
x <- c('/travel',
       '/food and drink/restaurants',
       '/food and drink',
       '/sports/outdoors/climbing',
       '/news',
       '/family')

大写每个字

gsub('(?<=\\b)([a-z])', '\\U\\1', x, perl =  TRUE)

# [1] "/Travel"                     "/Food And Drink/Restaurants" "/Food And Drink"            
# [4] "/Sports/Outdoors/Climbing"   "/News"                       "/Family"   

提取第一个/..

gsub('^/([^/]+)|.', '\\1', x)

# [1] "travel"         "food and drink" "food and drink" "sports"         "news"          
# [6] "family" 

结合两者

gsub('(?<=\\b)([a-z])', '\\U\\1', gsub('^/([^/]+)|.', '\\1', x), perl =  TRUE)

# [1] "Travel"         "Food And Drink" "Food And Drink" "Sports"         "News"          
# [6] "Family"  

如果您不关心大写的“和”,则可以使用第二个gsubtools::toTitleCase

tools::toTitleCase(gsub('^/([^/]+)|.', '\\1', x))

# [1] "Travel"         "Food and Drink" "Food and Drink" "Sports"         "News"          
# [6] "Family" 
require(magrittr)

txt <- c("/travel", "/food and drink/restaurants", "/food and drink", "/sports/outdoors/climbing", "", "/news", "/family")

strsplit(txt, "/") %>% sapply( '[', 2 )  #per Frank's suggestion

##  [1] "travel"         "food and drink" "food and drink" "sports"        
##  [5] NA               "news"           "family"        

一种快速的方法如下:我假设要收集的部分中只有单词字符\\w和空格\\s

char<- c("/travel","/food and drink/restaurants","/food and drink","/sports/outdoors/climbing","","/news","/family")

match <- regexpr("[\\w\\s]+",char,perl=TRUE)
regmatches(char,match)

## regmatches(char,match)
## [1] "travel"         "food and drink" "food and drink" "sports"        
## [5] "news"           "family"   

您可能需要安装stringi软件包(无论如何您都应该拥有它:),但是以下方法可以解决问题

stringi::stri_trans_totitle( gsub("/([^/]+)", "\\1", data))

gsub只是在第一个/后面直到第二个/或字符串的末尾选择文本。 然后stringi::stri_trans_totitle为您进行大小写转换。

> s <-c("/food and drink/restaurants", "/beer and wine", "", "/news")
> stringi::stri_trans_totitle( gsub("/([^/]+)", "\\1", s))
[1] "Food And Drinkrestaurants" "Beer And Wine"            
[3] ""                          "News"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM