我希望提取带有任意小数的数字(小数点两边至少各有一个数字),但不后面跟着百分比的模式。因此,我相信我需要一个负前瞻(这样它就可以看到数字后面是否有百分号)。
为了清楚起见,我想要提取“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
最佳答案
您可以使用
"\\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"
关于r - 正则表达式中的负向前瞻以排除 R 中的百分比 (%),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54552393/