R正则表达不太正确

时间:2014-06-25 04:40:26

标签: regex r

我在R中使用正则表达式时遇到问题。也许我只是在看它太久了。我有形式的字符串

'thing1 - thing2'
'thingA - thingB'

其中第一个与空格,短划线和另一个空格分开。第一件事是字母,数字,斜线和句号的组合;第二个可以是相同的,或者不存在(在这种情况下也没有分离破折号)。我想使用regmatchesgregexpr来查找与第一和第二部分匹配的模式。这就像

regmatches(
  'thing1 - thing2',
  gregexpr('^(\\w|\\s|\\.|/)+(\\s-\\s){0,1}', 'thing1 - thing2', perl=T)
)

很好,很好。但有时thing1很棘手,没有空格(例如10-43),或者它可能是确切的字符串Blue - MC,这显然会混淆“{{1}分隔}“ 规则。而我似乎无法正确使用正则表达式!我试过了

\\s-\\s

我得到regmatches( c('10-43', 'Blue - MC'), gregexpr( '^\\w(\\w|\\s|\\.|/\\S-\\S)+\\s-\\s{0,1}|^Blue\\s-\\sMC', c('10-43', 'Blue - MC'), perl=T ) ) 。救命?谢谢!

2 个答案:

答案 0 :(得分:4)

我知道您说要使用gregexprregmatches,但为什么不strsplit,因为您所做的就是分割“总是分开的字符串通过空间划线空间“

根据您的评论,您可以在space-dash-space处进行拆分,但只需在应用拆分之前从列表中删除Blue - MC即可保留Blue - MC。然后你可以在之后添加它。

> things <- c('thing1 - thing2', 'thingA - thingB', 'thingC', 'Blue - MC')
> w <- which(things == 'Blue - MC')
> ( s <- c(strsplit(things[-w], " - ", fixed = TRUE), things[w]) )
#[[1]]
#[1] "thing1" "thing2"

#[[2]]
#[1] "thingA" "thingB"

#[[3]]
#[1] "thingC"

#[[4]]
#[1] "Blue - MC"

然后,如果你只想要每个中的第一个,

> sapply(s, "[", 1)
#[1] "thing1" "thingA" "thingC" "Blue - MC"

答案 1 :(得分:1)

当我想捕获部分消息时,我喜欢使用regcapturedmatches.R帮助函数。我会像这样使用它

v <- c("thing1 - thing2", "thingalone","Blue-MC","1 - 2")
m <- gregexpr('^(.*?)(?:\\s-\\s(.*))?$', v, perl=T)
regmatches(v, m)
do.call(rbind, regcapturedmatches(v,m))

返回

     [,1]         [,2]    
[1,] "thing1"     "thing2"
[2,] "thingalone" ""      
[3,] "Blue-MC"    ""      
[4,] "1"          "2" 

我认为这符合您的期望。