使用R中的正则表达式将字符串拆分为多个部分

时间:2015-02-21 04:09:31

标签: regex r string

我需要将一个字符串拆分为三个部分(itemName,delimiter,itemNum)。作为在R中学习正则表达式/字符串函数的第一次尝试,我使用“regex-magic”来生成模式

grepl("\\A[[:<:]][A-Za-z]+[._~-]*(?:[0-9]+)+[[:>:]]\\z", "bob.~-1234", perl=TRUE);

我想我理解,这三种模式:[A-Za-z]+[._~-]*[0-9]+是指。我对\\A[[:<:]]+[[:>:]]\\z一无所知。我也不明白如何指定可选的分隔符。

此外,我需要使用哪个函数返回包含三个部分的向量:"bob"".~-""1234"

2 个答案:

答案 0 :(得分:3)

\A是一个锚,它断言字符串中的当前位置是字符串的开头。 \z锚点断言字符串中的当前位置是字符串的非常结尾。 POSIX word boundaries定义为[[:<:]][[:>:]]。第一个是单词起始边界,第二个是单词结束边界。你可以把它们留在这里。

您可以使用gsubfn包中的strapply来匹配整个模式。

strapply('bob.~-1234', '\\A([a-zA-Z]+)([._~-]*)(\\d+)\\z', c, perl=T)[[1]]
# [1] "bob"  ".~-"  "1234"

答案 1 :(得分:2)

POSIX标准将[[:<:]]定义为词头边界,将[[:>:]]定义为词尾边界。

您可以尝试以下strsplit功能来获得所需的输出。

> strsplit("bob.~-1234", "(?<=[._~-])(?=[0-9])|(?<=[A-Za-z])(?=[._~-])",perl=T)
[[1]]
[1] "bob"  ".~-"  "1234"

OR

> strsplit("bob.~-1234", "(?<=\\w)(?=\\W)|(?<=\\W)(?=\\w)",perl=T)
[[1]]
[1] "bob"  ".~-"  "1234"