R regex在第二次出现/在数据帧列中后删除任何内容
我将数据存储在dataframe列中,如下所示:R regex在第二次出现/在数据帧列中后删除任何内容,regex,r,Regex,R,我将数据存储在dataframe列中,如下所示: /travel /food and drink/restaurants /food and drink /sports/outdoors/climbing /news /family Travel Food And Drink Food And Drink Sports News Family 每行都有一些/的数字,但它们总是以/开头。有些行也是空白的。我只需要将此数据转换为只包含第一个/后面但第二个/之前的文本。我还想将结果中每个单词的
/travel
/food and drink/restaurants
/food and drink
/sports/outdoors/climbing
/news
/family
Travel
Food And Drink
Food And Drink
Sports
News
Family
每行都有一些/的数字,但它们总是以/开头。有些行也是空白的。我只需要将此数据转换为只包含第一个/后面但第二个/之前的文本。我还想将结果中每个单词的第一个字母大写。所以我希望结果是这样的:
/travel
/food and drink/restaurants
/food and drink
/sports/outdoors/climbing
/news
/family
Travel
Food And Drink
Food And Drink
Sports
News
Family
一个快速的方法是:我假设您要收集的部分中只有单词character\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"
一个快速的方法是:我假设您要收集的部分中只有单词character\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只是在第一个/up之后拾取文本,直到字符串的第二个/或结尾。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"
您需要安装stringi软件包,而且您可能无论如何都应该拥有它:但是下面应该可以做到这一点
stringi::stri_trans_totitle( gsub("/([^/]+)", "\\1", data))
gsub只是在第一个/up之后拾取文本,直到字符串的第二个/或结尾。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"
结合两者
gsub('(?<=\\b)([a-z])', '\\U\\1', gsub('^/([^/]+)|.', '\\1', x), perl = TRUE)
# [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"
我不熟悉分隔符,所以我可能完全不适合在这里回答仍然有些新的问题,但许多语言都有类似于拆分字符串到分隔符上的数组。在VB中,选择第二个元素是SplitRowValue,/1,第一个元素为空,因为字符串以分隔符开头。用适当的case函数包装它应该会返回您指定的输出。@Snachmo是的,它符合Eugene的答案,在这样一个正则表达式问题上对大多数平台上可以使用的方法进行评论是公平的。我不熟悉R,因此,我可能完全不适合在这里回应仍然有些新的内容,但许多语言都有类似于拆分字符串到分隔符上的数组。在VB中,选择第二个元素是SplitRowValue,/1,第一个元素为空,因为字符串以分隔符开头。将其包装在适当的大小写函数中应该会返回您指定的输出。@Snachmo是的,它符合Eugene的答案,在这样一个正则表达式问题上对大多数平台上可能适用的方法进行评论是公平的。对不起,使用%>%时习惯的力量好的,我第一次没有注意到它。顺便说一句,txt%%>%strsplit/%%>%sapply`[`,2个很好。通常人们在需要管道的情况下使用librarymagrittr。那太棒了!我不知道!对不起,使用%>%Ok时习惯的力量,我第一次没有注意到。顺便说一句,txt%%>%strsplit/%%>%sapply`[`,2行。通常人们在只需要管道的情况下使用librarymagrittr。这太棒了!不知道!回答得好@rawr!您能解释一下用于提取/s之间文本的regexp语法吗?@sebbardo^/表示匹配/在行首,…将…发送到第一个捕获组,我们可以使用\\1,在示例是由[…]定义的一类字符包括除^/以外的任何内容。因此,这将从行a/的开头开始匹配,后跟并捕获除/以外的任何内容。一次或多次+表示一个或多个。或者我们匹配任何字符|。但不捕获第二部分是一个很好的技巧,可以在gsub调用中除去捕获组之外的所有内容。我将添加到我的ansgreat答案@rawr!您能解释一下在/s之间提取文本的regexp语法吗?@sebbardo^/表示匹配/在行首,…将…发送到我们可以引用的第一个捕获组\\1,本例中的…是由[…]定义的一类字符包括除^/以外的任何内容。因此,这将从行a/的开头开始匹配,后跟并捕获除/以外的任何内容。一次或多次+表示一个或多个。或者我们匹配任何字符|。但不捕获第二部分是一个很好的技巧,可以在gsub调用中除去捕获组之外的所有内容。我将添加到我的ans中