我希望提取带小数点的数字(至少有一个数字在小数点的两边),但是不是模式,后跟百分比。因此,我认为我需要一个负的前瞻性(以便可以看到数字后面是否有一个百分号)。
为清楚起见,我想提取"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
答案 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]+$")