我可以使用哪种正则表达式条件来捕获具有 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&lt;-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 中单位的数学公式?的主要内容,如果未能解决你的问题,请参考以下文章

具有捕获组的有效正则表达式,但 sed 脚本不起作用

值两侧的测量单位的正则表达式 (200 g/g 200)

如何使用正则表达式捕获科学记数法中的减号?

[Go] 在golang中使用正则表达式捕获子表达式

正则表达式中的或与

具有命名捕获支持的 Ruby 正则表达式匹配枚举器