代码之家  ›  专栏  ›  技术社区  ›  stevec Zxeenu

正则表达式中的负前瞻,以排除R中的百分比(%)

  •  2
  • stevec Zxeenu  · 技术社区  · 6 年前

    我希望提取任意小数的数字(小数点两侧至少有一个数字),但是

    为了清楚起见,我想提取 "123.123" ,但不想提取 "123.123%"

    c("123.123%", "123.123") %>% str_extract_all(., "\\d+\\.\\d+")
    

    但我想调整它,使其仅返回第二项(因为第一项包含一个百分号)。

    我尝试了以下各种组合:

    c("123.123%", "123.123") %>% str_extract_all(., "\\d+\\.\\d+(!?=%)")
    c("123.123%", "123.123") %>% str_extract_all(., "\\d+\\.\\d+[!?%]")
    c("123.123%", "123.123") %>% str_extract_all(., "\\d+\\.\\d+!?%")
    c("123.123%", "123.123") %>% str_extract_all(., "\\d+\\.\\d+!?\\%")
    c("123.123%", "123.123") %>% str_extract_all(., "\\d+\\.\\d+(!?=\\%)")
    # etc
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   Wiktor Stribiżew    6 年前

    你可以用

    "\\d+\\.\\d++(?!%)"
    

    \d++(?!%) 部分匹配1个或多个数字 占有 (?!%) 在所有这些数字匹配后执行一次负前瞻,如果存在错误,则匹配失败 % 在他们后面。

    同样的句子也可以在没有所有格量词的情况下写成 "\\d+\\.\\d+(?![%\\d])" ,而 (?![%\\d]) 如果当前位置右侧有一个数字,则匹配也将失败。

    > library(stringr)
    > c("123.123%", "123.123") %>% str_extract_all(., "\\d+\\.\\d++(?!%)")
    [[1]]
    character(0)
    
    [[2]]
    [1] "123.123"
    
        2
  •  1
  •   Chris Littler    6 年前

    c("123.123%", "123.123") %>% str_extract_all(., "\\d+\\.\\d+$")
    

    [[1]]

    [[2]]

        3
  •  1
  •   akrun    6 年前

    我们可以通过添加 ^ $ 在模式中字符串的开头和结尾处

    c("123.123%", "123.123") %>% 
          str_extract_all(., "^[0-9]+\\.[0-9]+$")