首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“相反”结果的正则表达式

“相反”结果的正则表达式
EN

Stack Overflow用户
提问于 2014-07-10 06:42:40
回答 2查看 581关注 0票数 2

取以下字符向量x

代码语言:javascript
复制
x <- c("1     Date in the form", "2     Number of game", 
       "3     Day of week", "4-5     Visiting team and league")

我想要的结果是下面的向量,每个字符串的第一个大写单词,如果字符串包含一个-,也是最后一个单词。

代码语言:javascript
复制
[1] "Date"     "Number"   "Day"      "Visiting" "league"  

所以不要做

代码语言:javascript
复制
unlist(sapply(strsplit(x, "[[:blank:]]+|, "), function(y){
   if(grepl("[-]", y[1])) c(y[2], tail(y,1)) else y[2] 
}))

为了得到结果,我想我可以尝试将它缩短为正则表达式。结果几乎是sub中这个正则表达式的“反面”。我试过每一种方法都可以得到相反的结果,其中包括不同种类的[^A-Za-z]+,但都没有成功。

代码语言:javascript
复制
> sub("[A-Z][a-z]+", "", x)
[1] "1      in the form"       "2      of game"           
[3] "3      of week"           "4-5      team and league"

所以我想这是两个部分的问题。

  1. 使用sub()gsub(),如何返回与"[A-Z][a-z]+"相反的
  2. 我如何编写正则表达式来读“匹配第一个大写单词,如果字符串包含一个-__,也匹配最后一个单词”。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-10 08:42:43

以下是一些建议:

  1. 要使用sub提取第一个大写单词,可以使用 分(“.*\b(A.*?)\b.*”、“1”、x) #1“日期”“编号”“日”“来访” 其中\\b表示一个单词边界。
  2. 您也可以使用一个sub命令提取所有单词,但请注意,您必须应用额外的步骤,因为sub返回的向量的长度与输入向量x的长度相同。 下面的正则表达式使用查找((?=.*-))来测试字符串中是否存在-。如果是这样的话,就会提取两个单词。如果不存在,则应用逻辑或(|)之后的正则表达式,并仅返回第一个大写单词。 .*\b(A-Z*\b).*\b(.+)$(?:*b(A*?)\b*)“”,"\1\2\3",x,perl =真)#1“日期”“日期”“日”“来访联盟” 要将同一个字符串中的多个单词分隔开来,还需要一个额外的步骤: 取消列表(strsplit(res,“",fixed = TRUE)) #1”日期“”编号“”日“”来访“”联赛“
票数 3
EN

Stack Overflow用户

发布于 2014-07-10 08:59:00

下面是一个使用三个正则表达式的解决方案。

代码语言:javascript
复制
cap_words <- regmatches(x, regexpr("[A-Z][a-z]+", x))   # capitalised word
last_words <- sub(".*\\s", "", x[grep("-", x)]) # get last word in strings with a dash
c(cap_words, last_words)
# [1] "Date"     "Number"   "Day"      "Visiting" "league" 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24670038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档