正则表达式中的负前瞻,以排除R

时间:2019-02-06 11:18:28

标签: r regex stringr

我希望提取带小数点的数字(至少有一个数字在小数点的两边),但是不是模式,后跟百分比。因此,我认为我需要一个负的前瞻性(以便可以看到数字后面是否有一个百分号)。

为清楚起见,我想提取"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 个答案:

答案 0 :(得分:1)

您可以使用

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

\d++(?!%)部分会完全匹配1个或多个数字,并且所有这些数字都匹配后,将执行(?!%)否定超前查询,如果存在{ {1}}。

可以写成不带所有格修饰符的%,其中"\\d+\\.\\d+(?![%\\d])"如果当前位置的右边紧跟数字,则匹配也会失败。

R演示

(?![%\\d])

答案 1 :(得分:1)

我们允许只使用一个停止字符,如果没有其他可以跟随该数字的数字,我们可能会没事的。

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

[[1]] 字符(0)

[[2]] [1]“ 123.123”

答案 2 :(得分:1)

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

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