将表达式细分为替代子模式 - 使用gsub()

时间:2015-12-27 16:13:04

标签: regex r

我试图在我的gsub()函数中细分我的元字符表达式。但它没有返回任何发现的东西。

任务:我想在我的字符串向量中删除包含.ST-XST的字符串的所有部分。

如下所示,使用一个表达式可以正常工作。但是|表达式根本不起作用。我正在关注https://www.stat.auckland.ac.nz/~paul/ItDT/HTML/node84.html

上的元字符指南

可能是什么问题?是什么导致了这个问题?

我的数据

> rownames(table.summary)[1:10]
 [1] "AAK.ST"      "ABB.ST"      "ALFA.ST"     "ALIV-SDB.ST" "AOI.ST"      "ATCO-A.ST"   "ATCO-B.ST"   "AXFO.ST"     "AXIS.ST"     "AZN.ST"

> gsub(pattern = '[.](.*)$ |  [-](.*)$', replacement = "", x = rownames(table.summary)[1:10])
 [1] "AAK.ST"      "ABB.ST"      "ALFA.ST"     "ALIV-SDB.ST" "AOI.ST"      "ATCO-A.ST"   "ATCO-B.ST"   "AXFO.ST"     "AXIS.ST"     "AZN.ST"       

> gsub(pattern = '[.](.*)$', replacement = "", x = rownames(table.summary)[1:10])
 [1] "AAK"      "ABB"      "ALFA"     "ALIV-SDB" "AOI"      "ATCO-A"   "ATCO-B"   "AXFO"     "AXIS"     "AZN"     

> gsub(pattern = '[-](.*)$', replacement = "", x = rownames(table.summary)[1:10])
 [1] "AAK.ST"  "ABB.ST"  "ALFA.ST" "ALIV"    "AOI.ST"  "ATCO"    "ATCO"    "AXFO.ST" "AXIS.ST" "AZN.ST" 

2 个答案:

答案 0 :(得分:1)

这会在文本末尾找到.ST-XST,并用空字符串替换它(有效删除该部分)。不要忘记gsub 返回修改过的字符串,而不是修改它。在将返回值重新分配给某个变量之前,您不会看到任何更改。

strings <- c("AAK.ST", "ABB.ST", "ALFA.ST", "ALIV-SDB.ST", "AOI.ST", "ATCO-A.ST", "ATCO-B.ST", "AXFO.ST", "AXIS.ST", "AZN.ST", "AAC-XST", "AAD-XSTV")

strings <- gsub('(\\.ST|-XST)$', '', strings)

您的正则表达式([.](.*)$ | [-](.*)$'),如果不是不必要的空格,则会从第一个点(.)或破折号(-)删除所有内容文字结束。这可能是你想要的,但不是你想要的。

答案 1 :(得分:1)

您似乎使用IgnorePatternWhitespaceVERBOSE/x)之类的标记测试了您的正则表达式,该标记允许在模式内部使用空格以提高可读性。您can use it选项perl=T

d <- c("AAK.ST","ABB.ST","ALFA.ST","ALIV-SDB.ST","AOI.ST","ATCO-A.ST","ATCO-B.ST","AXFO.ST", "AXIS.ST","AZN.ST")
gsub('(?x)[.](.*)$ |  [-](.*)$', '', d, perl=T)
## [1] "AAK"  "ABB"  "ALFA" "ALIV" "AOI"  "ATCO" "ATCO" "AXFO" "AXIS" "AZN" 

但是,你真的不必在这里使用那个复杂的正则表达式。

如果您计划从第一个连字符中删除所有子字符串或从最后一个点开始删除,可以使用以下正则表达式:

[.-].*$

字符类[.-]将匹配第一个.-符号,.*将匹配字符串末尾的所有字符($ )。

请参阅IDEONE demo

d <- c("AAK.ST","ABB.ST","ALFA.ST","ALIV-SDB.ST","AOI.ST","ATCO-A.ST","ATCO-B.ST","AXFO.ST", "AXIS.ST","AZN.ST")
gsub("[.-].*$", "", d)

结果:[1] "AAK" "ABB" "ALFA" "ALIV" "AOI" "ATCO" "ATCO" "AXFO" "AXIS" "AZN"