Regex R中的正向前瞻

Regex R中的正向前瞻,regex,r,Regex,R,这里是正则表达式新手 采用以下名称: names <- c("Jackson, Michael", "Lennon, John", "Obama, Barack") 我知道这是一个简单的解决方案,但我一直坚持指定一个似乎合理的解决方案,即一个积极的前瞻正则表达式。我根据逗号、空格和大写字母中的第一个字母指定匹配项。这就是我所拥有的,但显然是错误的: names.reduced <- gsub("(?=\\,\\s[A-Z]).*", "", names) names.reduce

这里是正则表达式新手

采用以下名称:

names <- c("Jackson, Michael", "Lennon, John", "Obama, Barack")
我知道这是一个简单的解决方案,但我一直坚持指定一个似乎合理的解决方案,即一个积极的前瞻正则表达式。我根据逗号、空格和大写字母中的第一个字母指定匹配项。这就是我所拥有的,但显然是错误的:

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

names.reduced您可以使用lookback而不是lookahead断言

sub('(?<=, [A-Z]).*$', '', names, perl=TRUE)
#[1] "Jackson, M" "Lennon, J"  "Obama, B"  
sub(')(?是一个零宽度断言,它不使用字符串上的任何字符

它只匹配字符串中的一个位置。零宽度点是验证正则表达式是否可以从当前位置向前匹配,而不添加到整体匹配中。在这种情况下,根本不需要使用前向断言

您可以使用捕获组,在替换调用中反向引用该组来完成此操作

sub('(.*[A-Z]).*', '\\1', names)
# [1] "Jackson, M" "Lennon, J"  "Obama, B"
或者更好的是,您可以使用否定来删除字符串末尾除
A
Z
之外的所有内容

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

您还可以使用
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"  

\\1
是什么意思?@BrianP,看看我的另一个。
\\1
是捕获组匹配的反向引用
(…)
> stri_extract(names, regex=".*[A-Z]")
[1] "Jackson, M" "Lennon, J"  "Obama, B"