R中复杂的正则表达式

时间:2013-11-02 06:44:30

标签: regex r

word<-"xyz9874w9874w"
gsub( "([a-z]+)([0-9]+)([a-z])(\\w)", "\\1", word )
[1] "xyz874w"
gsub( "([a-z]+)([0-9]+)([a-z])(\\w)", "\\2", word )
[1] "9874874w"
gsub( "([a-z]+)([0-9]+)([a-z])(\\w)", "\\3", word )
[1] "w874w"
gsub( "([a-z]+)([0-9]+)([a-z])(\\w)", "\\4", word )
[1] "9874w"

在我看来:

  • 第一部分([a-z] +)匹配xyz;
  • 第二部分([0-9] +)匹配9874;
  • 第三部分([a-z])匹配w;
  • 第四部分(\ w)匹配9874w;

为什么reslut不是:

gsub( "([a-z]+)([0-9]+)([a-z])(\\w)", "\\1", word )  
[1] "xyz"  
gsub( "([a-z]+)([0-9]+)([a-z])(\\w)", "\\2", word )  
[1] "9874"  
gsub( "([a-z]+)([0-9]+)([a-z])(\\w)", "\\3", word )  
[1] "w" 

在([az] +)([0-9] +)([az])(\ w)中添加*是正确的,使其成为([az] +)([ 0-9] +)([AZ])(\ W *),
如果我的常规模式中没有*,如何理解结果?

1 个答案:

答案 0 :(得分:3)

使用\\w的模式正在寻找任何“单词字符”(== [[:alnum:]_]),而看起来您可能想要查找实际的“w”:\\w匹配“9”,其余字符“874w”未被替换。如果你想匹配字符串的其余部分,那么为什么第四个捕获组没有“。+ $”?

 gsub( "([a-z]+)([0-9]+)([a-z])(.+$)", "\\1", word )
[1] "xyz"
> gsub( "([a-z]+)([0-9]+)([a-z])(.+$)", "\\2", word )
[1] "9874"
> gsub( "([a-z]+)([0-9]+)([a-z])(.+$)", "\\3", word )
[1] "w"
> gsub( "([a-z]+)([0-9]+)([a-z])(.+$)", "\\4", word )
[1] "9874w"

根据底层问题的未说明的“规则”,它可以添加特殊性以将“^”作为前导模式字符,以便匹配从第一个字符开始。