R中的前瞻性

时间:2015-04-11 02:33:52

标签: regex r

这里正则表达式的新手...

假设以下名称:

names <- c("Jackson, Michael", "Lennon, John", "Obama, Barack")

我想拆分名称,以保留所有字符,包括名字的第一个字母。因此,结果将是这样的:

Jackson, M
Lennon, J
Obama, B

我知道这是一个简单的解决方案,但我仍然坚持指出一个看似合理的解决方案 - 即一个积极的前瞻性正则表达式。我根据逗号,空格和大写字母中的第一个字母指定匹配项。这就是我所拥有的,但显然它是错的:

names.reduced <- gsub("(?=\\,\\s[A-Z]).*", "", names)

3 个答案:

答案 0 :(得分:10)

(?= ... )是零宽度断言,不消耗字符串上的任何字符。

它只匹配字符串中的位置。零宽度的点是验证正则表达式是否能够或者不能与当前位置相匹配,而不是添加到整体匹配。在这种情况下,根本不需要使用先行断言。

您可以使用捕获组执行此操作,反向引用替换呼叫中的组。

sub('(.*[A-Z]).*', '\\1', names)
# [1] "Jackson, M" "Lennon, J"  "Obama, B"

或者更好的是,你可以使用否定删除字符串末尾的AZ以外的所有内容。

sub('[^A-Z]*$', '', names)
# [1] "Jackson, M" "Lennon, J"  "Obama, B"

答案 1 :(得分:3)

你可以使用lookbehind而不是lookahead断言

sub('(?<=, [A-Z]).*$', '', names, perl=TRUE)
#[1] "Jackson, M" "Lennon, J"  "Obama, B"  

答案 2 :(得分:2)

您也可以使用regmatches功能。

> names <- c("Jackson, Michael", "Lennon, John", "Obama, Barack")
> regmatches(names, regexpr(".*,\\s*[A-Z]", names))
[1] "Jackson, M" "Lennon, J"  "Obama, B"

> library(stringi)
> stri_extract(names, regex=".*,\\s*[A-Z]")
[1] "Jackson, M" "Lennon, J"  "Obama, B"  

将所有字符匹配到最后一个大写字母。

> stri_extract(names, regex=".*[A-Z]")
[1] "Jackson, M" "Lennon, J"  "Obama, B"