2014-08-30 84 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