我可以使用哪种正则表达式条件来捕获具有 R 中单位的数学公式?
Posted
技术标签:
【中文标题】我可以使用哪种正则表达式条件来捕获具有 R 中单位的数学公式?【英文标题】:Which regex condition could I use in to capture a math formula with units in R? 【发布时间】:2022-01-06 22:07:26 【问题描述】:我正在查看 odf 公式中的代码,看起来有点像这样: 500mgl 超过 4.05 克
我想在 R 中使用带有 gsub 的正则表达式将所有带有模式的元素括在括号中
([0-9]+)([A-Za-z]+)
避免某些单位不显示在分母中。 但是,如果我这样做,各个单元最终将与 实数:4,0.5g 所以我想首先用逗号将数字括起来:
a<-"4,05g"
gsub("([0-9]+)(\\,)([0-9]+)([A-Za-z]+)","\\1\\2\\3\\4",a)
然后,用括号将模式括起来:
([0-9]+)([A-Za-z]+)
但前提是模式之前没有左括号。 我尝试在网上搜索回溯语法如何与正则表达式一起工作,但是,我对它在 R 的 gsub 中的工作方式感到非常困惑。 我试过这样的事情:
gsub("([^\\.])([0-9]+)([A-Za-z]+)","\\2\\3",a)
gsub("(?[\\.])([0-9]+)([A-Za-z]+)","\\2\\3",a)
gsub("(!\\.?)([0-9]+)([A-Za-z]+)","\\2\\3",a)
但老实说,我不知道自己在做什么。
编辑:我认为前一个字符的豁免必须不是括号而是逗号。这样可以避免输出
"0,3g
" 0,3g"
但能够做到
"30g"
"30g"
【问题讨论】:
非常努力地口头描述你想要什么。但是,读了几次后,我不确定预期的输出是什么样的。你能添加一个特定的输入和预期的输出吗?是从"(500mg"/"L* 10.00) over 4,05"
到"(500mg)/(L*10.00) over (4,05)"
?
就像在图片中,在代码所在的第三行。我想用单位 12g 将整数括在括号中,用小数括起来 12,4g 问题是,除了前一个括号外,将整数括在括号中会使数字超出其小数部分 4, 2g 就像在您的示例中一样,但使用括号而不是括号。但是,如果我只选择带逗号的模式,我不会将整数与它各自的单位括起来
我不确定这是否是您要查找的内容,但您是否尝试过将逗号设为可选?你可以使用,?
来做到这一点。整个正则表达式将如下所示:a<-c("4,05g", "50mg", "120,32mg"); gsub("(\\d+,?\\d+\\w+)", "\\1", a)
.
是的@Cett 我认为这符合我的意图。没有想到它是一个完整的模式。好主意。我明天上班时在电脑上试试
见ideone.com/8AOgQM。 \d+,?\d+\w+
在这里是错误的模式,因为它不会让您匹配单个数字。
【参考方案1】:
你可以使用
x <- "4,05g"
gsub("(\\d+(?:,\\d+)?[[:alpha:]]*)", "\\1", x)
请参阅R demo 和regex demo。
详情:
(
- 第 1 组开始(必需,因为 gsub
不支持对整个比赛的反向引用):
\d+
- 一位或多位数字
(?:,\d+)?
- 逗号和一个或多个数字的可选序列
[[:alpha:]]*
- 零个或多个字母
)
- 小组结束。
替换中的\1
是Group 1的值。
【讨论】:
以上是关于我可以使用哪种正则表达式条件来捕获具有 R 中单位的数学公式?的主要内容,如果未能解决你的问题,请参考以下文章