gpt4 book ai didi

r - gsub 返回超过正则表达式匹配

转载 作者:行者123 更新时间:2023-12-02 06:50:28 29 4
gpt4 key购买 nike

我有这样的字符串

x = c(
"blahblah, blah blah, Plate 3, blah blah"
,
"blah blah, blah_Plate 2_blah, blah"
,
"blah, blah, blah blah, blah plate_3"
,
"blah blah, blah, plate 5.txt"
)

我想从所有这些文件名中获取车牌号,

所以我正在测试我的正则表达式匹配

 gsub("\\<Plate\\>.[0-9]","\\1",workdf_nums_plats$Bioplex_Files)

所以我最终可以做这样的事情

workdf_nums_plats$plat <- ifelse(grepl("\\<Plate\\>.[0-9]", workdf_nums_plats$Bioplex_Files), gsub("\\<Plate\\>.[0-9]","\\1",workdf_nums_plats$Bioplex_Files), NA)

我正在返回整个字符串,我尝试使用\b 设置单词边界,但这没有帮助。

任何建议都会非常感谢!

最佳答案

你需要在里面定义一个捕获组并匹配plate以不区分大小写的方式,但不是整个单词,因为您需要在 _ 之后匹配它(它也是一个单词 char):

workdf_nums_plats$plat <- sub(".*?Plate.([0-9]+).*","\\1", workdf_nums_plats$Bioplex_Files, ignore.case=TRUE)

regex demo以及下面的 R 演示:

Bioplex_Files <- c("blahblah, blah blah, Plate 3, blah blah", "blah blah, blah_Plate 2_blah, blah", "blah, blah, blah blah, blah plate_3", "blah blah, blah, plate 5.txt")
plat <- sub(".*?Plate.([0-9]+).*","\\1", Bioplex_Files, ignore.case=TRUE)
plat
## => [1] "3" "2" "3" "5"

模式详情

  • .*? - 任何 0+ 个字符,尽可能少
  • Plate - plate子字符串(由于 ignore.case=TRUE 不区分大小写)
  • . - 任何字符
  • ([0-9]+) - 匹配 1 个或多个数字的第 1 组(使用 \1 替换模式的反向引用)
  • .* - 任何 0+ 个字符,直到字符串结尾。

如果你想匹配 Plate作为一个整体,您可以在 Plate 前面加上与 (?:_|\b)模式, ".*?(?:_|\\b)Plate.([0-9]+).*" .在这里,(?:_|\b)是匹配 $2 的非捕获组(即它不创建 $1_ 等)或单词边界。

另一种解决方案是匹配您需要的值,为此目的使用stringr很方便:

> str_extract(Bioplex_Files, "(?i)(?<=Plate.)[0-9]+")
[1] "3" "2" "3" "5"

这里,(?i)是不区分大小写的标志,(?<=Plate.)是一个积极的向后看,断言有 Plate以及紧接在 [0-9]+ 之前的任何字符- 1 个或多个数字(并且仅返回数字,因为后向模式是零长度断言,即它不会将文本添加到匹配值)。

关于r - gsub 返回超过正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45720913/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com