2014-08-30 83 views
4

我正在练习一个足球时间表我有R正则表达式并不能算出这个正则表达式r中没有特殊字符替换字符串

我基本上是试图改变任何主场比赛串家。这里是schedule_team数据框的片段,我使用:

Team w1 w2 w3 w4 w5 w6 w7 w8 w9 w10 w11 w12 w13 w14 
1 ARI SD @NYG SF BYE @DEN WSH @OAK PHI @DAL STL DET @SEA @ATL KC 
2 ATL NO @CIN TB @MIN @NYG CHI @BAL DET BYE @TB @CAR CLE ARI @GB 
3 BAL CIN PIT @CLE CAR @IND @TB ATL @CIN @PIT TEN BYE @NO SD @MIA 

非主队有一个@符号开始的字符串。主队不会。在python中使用正则表达式我相信所有的主队都可以用正则表达式来选择,如:^([A-Z])\ w + ..本质上说是从一个首都开始。这在R中不起作用,因为\ w等错误。

这里是我想什么(失败):

str_replace_all(as.matrix(schedule_teams), "[[^([A-Z])\w+]]", "HOME") 

有改变所有的家庭团队HOME更简单的方法?

在此先感谢

+0

关闭的话题,但你会更好重新格式化成一个长篇的数据帧这一点,每一行是一个团队和列“在哪里”和“对手”。它会更容易阅读,只有30行左右。 – 2014-08-30 16:29:12

+0

@RichardScriven谢谢理查德......那是我的计划,希望熟悉tidyr包这么做! – WycG 2014-08-30 18:34:51

回答

5

你的正则表达式语法不正确,你有它包裹在里面级联character classes的,你要使用捕获组导致的模式,当它到达关闭失败之类的内部)

为了简明扼要,你的正则表达式当前定义了一组字符(不是你想要的)然后失败。

[[^([A-Z] # any character of: '[', '^', '(', '[', 'A' to 'Z' 

要解决这个问题,你需要删除已置于其内的字符类和捕获组,确保你双逃逸\w在你的正则表达式模式,那么它应该为你工作。

我在我的控制台上测试了它,它工作正常。

> df[,-1] <- str_replace_all(as.matrix(df[,-1]), '^[A-Z]\\w+', 'HOME') 
## Team w1 w2 w3 w4 w5 w6 w7 w8 w9 w10 w11 w12 w13 w14 
## 1 ARI HOME @NYG HOME HOME @DEN HOME @OAK HOME @DAL HOME HOME @SEA @ATL HOME 
## 2 ATL HOME @CIN HOME @MIN @NYG HOME @BAL HOME HOME @TB @CAR HOME HOME @GB 
## 3 BAL HOME HOME @CLE HOME @IND @TB HOME @CIN @PIT HOME HOME @NO HOME @MIA 

除了使用stringr库,你可以,如果你坚持使用正则表达式做到这一点使用sub

> df[,-1] <- sub('^[A-Z]\\w+', 'HOME', as.matrix(df[,-1])) 

这里是不使用正则表达式的方法:

> m <- as.matrix(df[-1]) 
> m[substr(m,0,1) != '@'] <- 'HOME' 
> cbind(df[1], m) 
## Team w1 w2 w3 w4 w5 w6 w7 w8 w9 w10 w11 w12 w13 w14 
## 1 ARI HOME @NYG HOME HOME @DEN HOME @OAK HOME @DAL HOME HOME @SEA @ATL HOME 
## 2 ATL HOME @CIN HOME @MIN @NYG HOME @BAL HOME HOME @TB @CAR HOME HOME @GB 
## 3 BAL HOME HOME @CLE HOME @IND @TB HOME @CIN @PIT HOME HOME @NO HOME @MIA