我在R中使用正则表达式时遇到问题。也许我只是在看它太久了。我有形式的字符串
'thing1 - thing2'
'thingA - thingB'
其中第一个与空格,短划线和另一个空格分开。第一件事是字母,数字,斜线和句号的组合;第二个可以是相同的,或者不存在(在这种情况下也没有分离破折号)。我想使用regmatches
和gregexpr
来查找与第一和第二部分匹配的模式。这就像
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
)
)
。救命?谢谢!
和
答案 0 :(得分:4)
我知道您说要使用gregexpr
和regmatches
,但为什么不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"
我认为这符合您的期望。