R语言:正则表达式

时间:2015-02-16 08:54:23

标签: regex r

我在data.frame中有一个字符列,我需要在一系列数字后找到一个特定的字母。 问题是我无法准确知道我要找的具体信件的位置。 我所知道的是,这封特定的字母遵循六个数字的序列。

就是这样的例子:

test <– c('ABC150117X01100100', 'ABCD150630Y01000100', 'ABCDE160721Z11001000')

在这种情况下,我想要找的字母是 X Y Z 。 函数 substr 没用,我很确定正则表达式可能正是我正在寻找的。 提前感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

另一种选择:

 gsub(".*\\d{6}([A-Za-z]{1}).*","\\1",test)
#[1] "X" "Y" "Z"
<{> \\1 gsub允许检索regex中括号之间的内容,regex可以详细说明如下:

.*            # anything, matched 0 or more times
\\d{6}        # any digit, matched exactly 6 times (i.e. exactly 6 digits)
([A-Za-z]{1}) # what needs to be retrieved, a single letter
.*            # anything, matched 0 or more times

注意:如果你的字符串中还有6个以上的数字后跟一个字母,但你想要的字母恰好是6个数字,你可以更改"(.*\\D\\d{6}|^\\d{6})([A-Z]{1}).*"的正则表达式和{{1呼叫将是:
gsub
正好在6个数字后面找到一个字母,在字符串的开头或任何不是数字的字符之后。

答案 1 :(得分:1)

您可以使用以下正则表达式匹配前面正好有6位数字的大写字母。

"(?<!\\d)\\d{6}(?!\\d)\\K[A-Z]"

DEMO

> x <- c("ABC150117X01100100", "ABCD150630Y01000100", "ABCDE160721Z11001000")
> m <- gregexpr("(?<!\\d)\\d{6}(?!\\d)\\K[A-Z]", x, perl=TRUE)
> regmatches(x, m)
[[1]]
[1] "X"

[[2]]
[1] "Y"

[[3]]
[1] "Z"

(?<!\\d)\\d{6}(?!\\d)匹配不在数字前面和后面的6位数字。 \K会丢弃匹配的号码。现在模式[A-Z]匹配以下大写字母。

答案 2 :(得分:1)

(?<=(?<=\\D)\\d{6})[A-Z]

你可以尝试一下。参见演示。

https://www.regex101.com/r/rK5lU1/22

有点像这样。

 x <- c("ABC150117X01100100", "ABCD150630Y01000100", "ABCDE160721Z11001000")
 m <- gregexpr("(?<=(?<=\\D)\\d{6})[A-Z]", x, perl=TRUE)
 regmatches(x, m)