regex - R 中的正向预测

标签 regex r

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

假设有以下名称:

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

我想拆分名称,以保留所有字符,包括名字的第一个字母。因此,结果将如下所示:
Jackson, M
Lennon, J
Obama, B

我知道这是一个简单的解决方案,但我坚持指定似乎是一个合理的解决方案 - 即积极的前瞻正则表达式。我正在根据逗号、空格和大写的第一个字母指定匹配项。这是我所拥有的,但显然是错误的:
names.reduced <- gsub("(?=\\,\\s[A-Z]).*", "", names)

最佳答案

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

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

您可以使用捕获组执行此操作,在替换调用中反向引用该组。

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"

关于regex - R 中的正向预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29573428/

相关文章:

java - 使用正则表达式在 Java 中拆分嵌套的 JSON

r - 如何在 for 循环中生成反射(reflect)分组变量名称的列?

r - 如何抑制 stats:::regularize.values 的警告?

python - 你可以在 colab notebook 中更改内核吗?

python - 将换行符和 XML 标签替换为 ','

Javascript检查字符串中的三个升序字母和数字

r - 如何用经验 CDF 绘制估计 CDF

r - 打印一列带有行名称的数据框

Python - 搜索并替换 HTML 中的 splinter 文本

python - 替换字符串中的子字符串