【问题标题】:Python regex to find arithmetic expressions in text stringsPython正则表达式在文本字符串中查找算术表达式
【发布时间】:2019-11-06 13:30:23
【问题描述】:

我尝试在文本字符串中查找算术表达式。

可能的算术表达式:

1/3 + 1/4
cos(30) + 25*3,75
sqrt(5) + sin(45)
5 != 6
2**4 + 100.000 =
(2^3)^4
sqrt((0,25*8)/2)
3e4 - 500

我创建了一个正则表达式并在块之间使用了| 符号。

pattern = '((\s*(sqrt|a?sin|a?cos|a?tan|abs|log|log10|exp)?\s*)* | (\s*[e0-9,.()\-]+\s*)* | (\spi\s*)* | (\s*[-+*/%^<>!=]*\s*)*)(\s*\=?\s*)?'

我真正想要的是所有块都可以按任何顺序互换使用。

我该怎么做?使用 | 符号不起作用。

【问题讨论】:

  • 我做错了什么Wiktor?
  • IMO 我不认为这是一个简单的问题 - 单独的 | 只会返回其中一个子模式,因此仅使用一个正则表达式检测这样的复杂表达式实际上并不可行(除非有可能,您需要一些超长的正则表达式,此时您可能会考虑性能是否会成为问题。)
  • 我认为 python re 库的表达能力不足以处理任意嵌套的括号表达式。

标签: python regex python-3.x math


【解决方案1】:

使用递归正则表达式的示例

([\d,.e]+|(cos|sin|sqrt)\((?R)\)|\([ ]*(?R)[ ]*\))([ ]*[-+*\/!=^]+[ ]*(?R))*

可以改进以更严格地匹配运算符或数字

  • (?R) 递归引用整个正则表达式

【讨论】:

  • 一个很好的解决方案!但是我真的不明白你在做什么。你能告诉我更多你在做什么吗?我注意到 'e' 也匹配文本中的 'e' 字符。能否请您也添加“pi”符号?
  • e 在一个字符类中,但是因为pi 是两个字符,所以应该使用交替(|):([\d,.e]+|pi) 但这也匹配 1,23,4ee4252,它不有道理,正则表达式只是作为示例给出
  • 谢谢。你能告诉我什么是 python 正则表达式来捕获更少可能的字符吗?在 vimscript 中你有 {-} 但这在 python 中不存在。体育cos(30 * 2)。我想捕获cos( 和下一个 FIRST ) 之间的所有字符
  • 我刚刚注意到 python 给出了半径的 sin/cos/tan 值。我想做的是将其更改为度数。 cos(..) --> math.cos(math.radians(..))
  • OP 用 Python 标记了这个,但是你给出的正则表达式对 Python 的标准库 re 模块无效。您可能想多说一点关于如何使用 Python 进行这项工作。 (你在使用 PyPI 的第 3 方 regex 模块吗?)
猜你喜欢
  • 2016-05-16
  • 1970-01-01
  • 2015-07-02
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多