我在data.frame中有一个字符列,我需要在一系列数字后找到一个特定的字母。 问题是我无法准确知道我要找的具体信件的位置。 我所知道的是,这封特定的字母遵循六个数字的序列。
就是这样的例子:
test <– c('ABC150117X01100100', 'ABCD150630Y01000100', 'ABCDE160721Z11001000')
在这种情况下,我想要找的字母是 X , Y 和 Z 。 函数 substr 没用,我很确定正则表达式可能正是我正在寻找的。 提前感谢您的帮助。
答案 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]"
> 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)