【问题标题】:Extract number with sign after string with stringr使用 stringr 在字符串后提取带符号的数字
【发布时间】:2020-03-17 16:36:13
【问题描述】:

我有一个字符串列表。我想在字符串“Kα1”之后返回带有符号的数字。

mylist <- c("Si/Si Kα1 pos-1 map data.tif", "Si/Si Kα1 pos1 map data.tif", "Si/Si Kα1 pos2 map data.tif", "Si/Si Kα1 pos3 map data.tif","Si/Si Kα1 pos4 map data.tif")

我试过了:

library(stringr)
str_extract(mylist, "([^Kα1]\\d)")
#[1] "-1" "s1" "s2" "s3" "s4"

但在该输出中的数字之前有字母。这是我想要的结果:

#[1] "-1" "1" "2" "3" "4"

【问题讨论】:

  • 你想要str_extract(mylist, "-?(?&lt;![Kα1])\\d+"),我想。您的意思是仅提取特定数字还是任意数字?
  • 谢谢@Wiktor Stribiżew!我只想要字符串之后出现的第一个数字。你的模式给了我正确的输出。
  • 请编辑问题,因为现在听起来好像您只需要-?\d+。如果需要确保需要提取的值前没有Kα1,则应写为要求。
  • 所以,我最初的解决方案是错误的,我发布了正确的解决方案。
  • 如果您只能使用stringr,请使用stringr::str_match(mylist, "Kα1.*?(-?\\d+)")[,2]\K 在 stringr 正则表达式函数中使用的 ICU 正则表达式中不受支持。为此,我们需要一个 PCRE 正则表达式引擎。而且您不能使用str_extract(mylist, "(?&lt;=Kα1.*?)-?\\d+"),因为ICU 正则表达式引擎不支持lookbehinds 中的未知宽度模式。

标签: r regex stringr


【解决方案1】:

你可以使用

mylist <- c("Si/Si Kα1 pos-1 map data.tif", "Si/Si Kα1 pos1 map data.tif", "Si/Si Kα1 pos2 map data.tif", "Si/Si Kα1 pos3 map data.tif","Si/Si Kα1 pos4 map data.tif")
regmatches(mylist, regexpr("Kα1.*?\\K-?\\d+", mylist, perl=TRUE))
## => [1] "-1" "1"  "2"  "3"  "4"
## Or, a stringr solution variant:
stringr::str_match(mylist, "Kα1.*?(-?\\d+)")[,2]
## => [1] "-1" "1"  "2"  "3"  "4"

请参阅R demo online。见regex demo here

正则表达式详细信息

  • Kα1 - 文字字符串
  • .*? - 除换行符以外的任何 0+ 字符,尽可能少
  • \K - 一个匹配重置操作符,它从匹配内存缓冲区中丢弃所有匹配的文本
  • -? - 一个可选的- 符号
  • \d+ - 一位或多位数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 2019-12-13
    • 2018-07-04
    相关资源
    最近更新 更多