在R中使用正则表达式替换不含特殊字符的字符串

4

我正在使用 R 语言和足球赛程进行正则表达式练习,但却无法解决以下问题:

我想将任何主场比赛更改为字符串“HOME”。 这是我正在使用的 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?
提前感谢。

离题了,但最好将其重新格式化为长形数据框,每行表示一个团队,具有“位置”和“对手”两列。这样更容易阅读,只有大约30行。 - Rich Scriven
@RichardScriven 谢谢Richard..这是我的计划,希望能熟悉tidyr包来实现! - WycG
1个回答

5
您的正则表达式语法不正确,它被包含在级联的字符类中,并且您试图在类内使用捕获组,这会导致模式在到达闭合)时失败。
简而言之,您当前的正则表达式定义了一组字符(不是您想要的内容),然后失败了。
[[^([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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接