在正则表达式负先行排除R中的百分比(%)

问题描述 投票:2回答:3

我愿与后跟百分比小数任何(至少一个数字小数点两侧),但不是模式,以提取号码。因此,我认为我需要负超前(因此可以看到,如果数字后跟百分号)。

为了清楚起见,我会想提取"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
r regex stringr
3个回答
1
投票

您可以使用

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

所述\d++(?!%)部分1个或多个数字匹配占有性和所有这些数字都匹配之后被执行一次的(?!%)负先行并且如果存在后他们%失败匹配。

同样可以在没有占有欲量词为"\\d+\\.\\d+(?![%\\d])",其中(?![%\\d])也会如果有一个数字立即到当前位置的权失败的比赛被写入。

[R演示:

> library(stringr)
> c("123.123%", "123.123") %>% str_extract_all(., "\\d+\\.\\d++(?!%)")
[[1]]
character(0)

[[2]]
[1] "123.123"

1
投票

我们现在可以只使用一个终止符,如果没有什么别的可以跟随我们可能会好起来的数量。

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

[[1]]字符(0)

[[2]] [1] "123.123"


1
投票

我们可以将图案字符串的开头的^$和端固定

c("123.123%", "123.123") %>% 
      str_extract_all(., "^[0-9]+\\.[0-9]+$")
© www.soinside.com 2019 - 2024. All rights reserved.