r语言 - 正则表达式,用于匹配重复字符的第一个实例



我的示例数据:

l1
[1] "xmms-1.2.11-x86_64-5"     "xmms-1.2.11-x86_64-6"    
[3] "xmodmap-1.0.10-x86_64-1"  "xmodmap-1.0.9-x86_64-1"  
[5] "xmodmap3-1.0.10-x86_64-1" "xmodmap3-1.0.9-x86_64-1"

我正在使用 R,并且想要一个正则表达式,该表达式将仅捕获第一个破折号之前的字符。如

xmms
xmms
xmodmap
xmodmap
xmodmap3
xmodmap3

由于我使用的是R,因此正则表达式需要符合Perl。

我以为我可以通过在破折号上使用回溯来做到这一点,但我只是得到了整个字符串的匹配。这是我尝试过的模式:grepl("(?<=[a-z0-9])-",l1, perl=T),但它只是匹配整个字符串。我想如果我将第一个破折号作为捕获组,我也许可以使用后视,但我不知道如何使用后视和捕获组构建正则表达式。

我环顾其他一些问题寻找可能的答案,似乎我需要一个不贪婪的符号?我尝试了grepl("(?<=[a-z0-9])-/.+?(?=-)/",l1, perl=T),但也没有用。

我愿意接受有关如何在破折号之前捕获第一组字符的其他建议。我目前在基本 R 中,但我可以使用任何包,例如纵梁。

您也可以提取直到第一次出现"-"。使用基本 Rsub

sub("(.*?)-.*", "\1", l)
#[1] "xmms"     "xmms"     "xmodmap"  "xmodmap"  "xmodmap3" "xmodmap3"

或带stringr::str_extract

stringr::str_extract(l, "(.*?)(?=-)")

数据

l <- c("xmms-1.2.11-x86_64-5","xmms-1.2.11-x86_64-6","xmodmap-1.0.10-x86_64-1",
"xmodmap-1.0.9-x86_64-1","xmodmap3-1.0.10-x86_64-1" ,"xmodmap3-1.0.9-x86_64-1")

> 1( 基数 R一个选项是从base Rsub以匹配后跟字符 (.*-,然后替换为空白 (""(

sub("-.*", "", l1)
#[1] "xmms"     "xmms"     "xmodmap"  "xmodmap"  "xmodmap3" "xmodmap3"

或成组捕获

sub("(\w+).*", "\1", l1)
#[1] "xmms"     "xmms"     "xmodmap"  "xmodmap"  "xmodmap3" "xmodmap3"

或者用regmatches/regexpr

regmatches(l1, regexpr('\w+', l1))
#[1] "xmms"     "xmms"     "xmodmap"  "xmodmap"  "xmodmap3" "xmodmap3"

或使用trimws

trimws(l1,  "right", whitespace = "-.*")
#[1] "xmms"     "xmms"     "xmodmap"  "xmodmap"  "xmodmap3" "xmodmap3"

或使用read.table

read.table(text = l1, sep="-", header = FALSE, stringsAsFactors = FALSE)$V1
#[1] "xmms"     "xmms"     "xmodmap"  "xmodmap"  "xmodmap3" "xmodmap3"

或与strsplit

sapply(strsplit(l1, "-"), `[`, 1)
<小时 />

2(纵梁stringrword

library(stringr)
word(l1, 1, sep="-")

或与str_remove

str_remove(l1, "-.*")
#[1] "xmms"     "xmms"     "xmodmap"  "xmodmap"  "xmodmap3" "xmodmap3"

3( stringi或与stringistri_extract_first

library(stringi)
stri_extract_first(l1, regex = "\w+")
#[1] "xmms"     "xmms"     "xmodmap"  "xmodmap"  "xmodmap3" "xmodmap3"

注意:grep/grepl用于检测字符串中的模式。 要替换/提取子字符串,请在base R中使用sub/regexpr/regmatches

数据

l1 <- c("xmms-1.2.11-x86_64-5", "xmms-1.2.11-x86_64-6", "xmodmap-1.0.10-x86_64-1", 
"xmodmap-1.0.9-x86_64-1", "xmodmap3-1.0.10-x86_64-1", "xmodmap3-1.0.9-x86_64-1"
)

我想与你所追求的匹配的最简单的正则表达式是

^[^-]+

匹配字符串 (^( 和至少一个不是-字符 ([^-]( 的开头 (+(。

在 regex101 上看到它。

如果需要捕获它,请添加周围的括号。

^([^-]+)

相关内容

  • 没有找到相关文章

最新更新