在系数之间添加乘号 (*)

2024-01-08

我有一个程序,用户在其中输入一个函数,例如sin(x)+1。我在用着ast尝试通过将组件列入白名单来确定字符串是否“安全”,如下所示这个答案 https://stackoverflow.com/a/11952618/4414003。现在我想解析字符串以添加乘法(*) 系数之间的符号没有它们。

例如:

  • 3x-> 3*x
  • 4(x+5) -> 4*(x+5)
  • sin(3x)(4) -> sin(3x)*(4) (sin已经在全局变量中,否则这将是s*i*n*(3x)*(4)

有没有有效的算法来实现这一点?我更喜欢Python式的解决方案(即不是复杂的正则表达式,不是因为它们是Python式的,而是因为我也不理解它们并且想要一个我能理解的解决方案。简单的正则表达式就可以了。)

我非常愿意使用sympy(对于这类事情来说,这看起来真的很容易)在一个条件下:安全。显然sympy uses eval在引擎盖下。我当前的(部分)解决方案具有很好的安全性。如果有人有办法制作sympy使用不受信任的输入更安全,我也欢迎这一点。


正则表达式无疑是在普通 python 中完成工作的最快、最干净的方法,我什至会为你解释正则表达式,因为正则表达式是一个非常强大的工具,很容易理解。

为了实现您的目标,请使用以下语句:

import re
# <code goes here, set 'thefunction' variable to be the string you're parsing>
re.sub(r"((?:\d+)|(?:[a-zA-Z]\w*\(\w+\)))((?:[a-zA-Z]\w*)|\()", r"\1*\2", thefunction)

我知道它有点长和复杂,但是一个不同的、更简单的解决方案不会立即变得显而易见,除非比这里的正则表达式中包含更多的黑客内容。但是,这已经针对您的所有三个测试用例进行了测试,并且完全符合您的要求。

作为对这里发生的事情的简要解释:第一个参数re.sub是正则表达式,它匹配某种模式。第二个是我们要替换的内容,第三个是要替换的实际字符串。每当我们的正则表达式看到匹配项时,它就会删除它并插入替换,并使用一些特殊的幕后技巧。

对正则表达式的更深入分析如下:

  • ((?:\d+)|(?:[a-zA-Z]\w*\(\w+\)))((?:[a-zA-Z]\w*)|\() : Matches a number or a function call, followed by a variable or parentheses.
    • ((?:\d+)|(?:[a-zA-Z]\w*\(\w+\))) : Group 1. Note: Parentheses delimit a Group, which is sort of a sub-regex. Capturing groups are indexed for future reference; groups can also be repeated with modifiers (described later). This group matches a number or a function call.
      • (?:\d+) : Non-capturing group. Any group with ?: immediately after the opening parenthesis will not assign an index to itself, but still act as a "section" of the pattern. Ex. A(?:bc)+ will match "Abcbcbcbc..." and so on, but you cannot access the "bcbcbcbc" match with an index. However, without this group, writing "Abc+" would match "Abcccccccc..."
        • \d:匹配任意数字一次。正则表达式为\d它自己的所有内容将分别匹配,"1", "2", and "3" of "123".
        • +: 匹配前一个元素一个或多个次。在这种情况下,前一个元素是\d, 任何数字。在前面的例子中,\d+“123”将成功匹配“123”作为单个元素。这对于我们的正则表达式至关重要,以确保正确注册多位数字。
      • |:管道字符,在正则表达式中,它有效地表示or: "a|b"将匹配"a" OR "b"。在这种情况下,它将“一个数字”和“一个函数调用”分开;匹配数字或函数调用。
      • (?:[a-zA-Z]\w*\(\w+\)) : Matches a function call. Also a non-capturing group, like (?:\d+).
        • [a-zA-Z]: 匹配函数调用的第一个字母。对此没有任何修改,因为我们只需要确保first字符是一个字母;A123从技术上讲是一个有效的函数名称。
        • \w:匹配任何字母数字字符或下划线。确保第一个字母后,后面的字符可以是字母、数字或下划线,并且仍然作为函数名称有效。
        • *: 匹配前一个元素0个或更多次。虽然最初看起来没有必要,但明星角色实际上是一个元素optional。在这种情况下,我们修改的元素是\w,但从技术上讲,函数不需要超过一个字符;A()是一个有效的函数名称。A将匹配[a-zA-Z], 制作\w不必要。另一方面,可以有任意数量的字符下列的第一个字母,这就是我们需要这个修饰符的原因。
        • \(:理解这一点很重要:这不是另一个团体。这里的反斜杠的作用很像普通字符串中的转义字符。在正则表达式中,任何时候您在特殊字符(例如括号)前面添加+, or *带有反斜杠,它像普通字符一样使用它。\(火柴左括号,用于函数的实际函数调用部分。
        • \w+:匹配数字、字母或下划线一次或多次。这确保了该函数实际上有一个参数进入其中。
        • \) : Like \(,但匹配一个closing插入语
    • ((?:[a-zA-Z]\w*)|\() : Group 2. Matches a variable, or an opening parenthesis.
      • (?:[a-zA-Z]\w*): 匹配一个变量。这与我们的函数名称匹配器完全相同。但是,请注意,这是在非捕获组中:这很重要,因为 OR 检查的方式。紧随其后的 OR 将该组视为一个整体。如果没有分组,“最后一个匹配的对象”将是\w*,这不足以满足我们的需求。它会说:“匹配一个字母后跟多个字母或一个字母后跟一个括号”。将此元素放入非捕获组中可以让我们控制 OR 寄存器的内容。
      • |: 或者性格。火柴(?:[a-zA-Z]\w*) or \(.
      • \(: 匹配左括号。一旦我们检查了是否有左括号,我们就不需要为了正则表达式的目的而检查它之外的任何内容。

现在,还记得我们的两组,第一组和第二组吗?这些用于替换字符串,"\1*\2"。替换字符串不是真正的正则表达式,但它仍然具有某些特殊字符。在这种情况下,\<number>将插入该号码的组。所以我们的替换字符串是这样的:“将第 1 组放入(我们的函数调用或我们的数字),然后放入星号 (*),然后放入我们的第二组(变量或括号)”

我想这就是总结吧!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在系数之间添加乘号 (*) 的相关文章

  • Python的unpack中的逗号是什么意思?

    我们可以简单地使用 crc struct unpack gt i data 为什么人们这样写 crc struct unpack gt i data 逗号是什么意思 第一个变体返回一个单元素元组 In 13 crc struct unpac
  • 在 Python 3.6 中,为什么负数的分数次方在 numpy 数组中返回 nan?

    我最近开始学习Python 并且经历了NumPy 官方快速入门指南 https docs scipy org doc numpy dev user quickstart html indexing slicing and iterating
  • 从终端调用时 uvicorn 不工作

    我尝试通过 pip3 在系统上安装 uvicorn 这有效 但是我无法从命令行运行相同的命令 有关如何解决此问题的任何指示 Requirement already satisfied uvicorn in home vhawk19 loca
  • 从 C 中的 char* 获取单个字符

    有没有办法在 C 中逐字符遍历或从 char 中提取单个字符 考虑以下代码 现在获得单个角色的最佳方式是什么 建议我一种不使用任何字符串函数的方法 char a STRING 其他方式 char i for i a i i i points
  • Pygame 玩家精灵没有出现

    我一直在为学校计算机课做这个项目 但无法让玩家精灵出现 有人可以帮忙吗 当我运行主游戏循环时 除了玩家精灵之外 所有内容都正确显示 它应该由于箭头输入而在屏幕上移动并受到重力的影响 当我删除图像并仅使用对象类和矩形时 该代码也有效 impo
  • 如何使用泛型类型的构造函数

    如何使用 python 泛型类型的构造函数 T typing TypeVar T class MyClass typing Generic T def init self initialValue typing Iterable self
  • Python变量赋值问题

    a b 0 1 while b lt 50 print b a b b a b 输出 1 2 4 8 16 32 wheras a b 0 1 while b lt 50 print b a b b a b 输出 正确的斐波那契数列 1 1
  • 在 Ubuntu 上使用 Python 获取显示器分辨率

    对于 Ubuntu win32api 中是否有与 GetSystemMetrics 相当的代码 我需要获取显示器的宽度和高度 以像素为单位 我可以建议一些可以使用的方法 不过我还没有使用过 xlib 版本 1 xlib Python 程序的
  • 将 csv 文件按多列拆分为 panda 数据框

    我有一个包含多列的 tsv 文件 有 10 多列 但对我来说重要的列是名称为 user name shift id url id 的列 我想创建一个数据框 首先根据用户名分隔整个 csv 文件 即只有具有相同用户名的行才会分组在一起 从该块
  • 如何抑制 pyinstaller 生成的可执行文件窗口中的所有警告

    我已经使用 pyinstaller 从 python 文件生成了可执行文件 该程序按其应有的方式工作 但在我想隐藏的窗口中出现了一条警告消息 当 python 文件在 IDE 中运行时 以下行会抑制所有警告消息 warnings filte
  • 在 Docker 容器内运行时,如何自动在 API 路由文件中进行 FASTAPI 拾取更改?

    我通过 docker 运行 FastApi 在 docker compose 中创建一个名为 ingestion data 的服务 我的 Dockerfile FROM tiangolo uvicorn gunicorn fastapi p
  • 尝试修复我的功能

    我正在开发一个函数 我必须返回一个元组 其中第一个参数是最大数字的 str 第二个参数是 int 列表 这是示例以及我为该函数编写的内容 投票 G G N G C G 1 3 0 1 您必须将最大值的位置映射到正确的一方 parties N
  • 多线程写入文件

    前几天刚开始使用 python 对多线程的整个概念还很陌生 我在多线程时写入文件时遇到问题 如果我按照常规方式执行此操作 它会不断覆盖正在写入的内容 使用 5 个线程写入文件的正确方法是什么 不降低性能的最佳方法是在所有线程之间使用队列 每
  • Python unittest - 与assertRaises相反?

    我想编写一个测试来确定在给定情况下不会引发异常 测试是否有异常很简单is上调 sInvalidPath AlwaysSuppliesAnInvalidPath self assertRaises PathIsNotAValidOne MyO
  • 具有条件的重复行 pandas dataframe python

    我的数据框有问题 我的 df 是 product power brand product 1 3 x 1500W brand A product 2 2x1000W 1x100W product 3 1x1500W 1x500W brand
  • 收到的标签值 1 超出了 [0, 1) 的有效范围 - Python、Keras

    我正在使用具有张量流背景的 keras 开发一个简单的 cnn 分类器 def cnnKeras training data training labels test data test labels n dim print Initiat
  • 避免在列表理解中计算相同的表达式两次[重复]

    这个问题在这里已经有答案了 我在列表理解中使用一个函数和一个 if 函数 new list f x for x in old list if f x 0 令我恼火的是这个表达f x 在每个循环中计算两次 有没有办法以更清洁的方式做到这一点
  • Python 类方法的示例用例是什么?

    我读了Python 中的类方法有什么用 https stackoverflow com questions 38238 what are class methods in python for但那篇文章中的例子很复杂 我正在寻找 Pytho
  • 如何从python导入路径中删除当前目录

    我想使用 Mercurial 存储库hg本身 也就是说 我克隆了 Mercurialhttps www mercurial scm org repo hg https www mercurial scm org repo hg并想运行一些h
  • Python列表问题

    我在使用 python 列表时遇到问题 简化版本是 mylist1 some items in a list mylist2 mylist1 mylist1 pop i mylist insert i item print mylist1

随机推荐

  • 如何将Firebase的身份验证链接到实时数据库?

    正如标题所说 我需要将经过身份验证的用户链接到数据库 这样不同的用户只能看到自己的数据 我已经成功实现了Firebase的身份验证功能 但记录不会保存到实时数据库 我不知道如何执行此操作 谁能教我如何实现这样的功能 我尝试了数据库 我大致知
  • 我可以在 Swift 中模拟特征/混合吗?

    Swift 是否有一种像 Scala 那样混合特征的方法 Swift 书中关于使用扩展向现有类添加协议的部分非常接近 但是 由于协议不能包含实现 因此不能用于将代码混合到类中 还有别的办法吗 模拟混合的一种方法是使用通用函数来提供实现 例如
  • ClassCastException:org.sonar.java.model.expression.MethodInitationTreeImpl 无法转换为 org.sonar.plugins.java.api.tree.IdentifierTree

    今天我们将SonarQube Java插件从3 2升级到3 3 http docs sonarqube org display PLUG Java Plugin http docs sonarqube org display PLUG Ja
  • 如何将 Micrometer 计时器与 webflux 端点一起使用

    是否有任何简单的方法可以将 Micrometer 计时器与 Webflux 控制器一起使用 看来 Timed 仅适用于非反应式方法 对于反应性来说 它记录的时间值非常低 我发现了一个类似的问题 如何使用 Micrometer Timer 记
  • 将两个 xml 片段合并为一个?

    如何合并xml内容 a and b into c declare a xml select 1 aaa for xml path AAAs declare b xml select 1 bb1 2 bb2 for xml path BBBs
  • 使用 HttpServer 或 HttpSelfHostServer 对 Web API 进行单元测试

    我正在尝试为 Web API 项目进行一些单元测试 我将模拟 Web API 托管环境 看来我可以使用内存主机 HttpServer 或自主机 HttpSelfHostServer 只是想知道有什么区别 哪种技术有什么好处 以及这些选项是否
  • Git-Svn dcommit 导致分支分裂

    我遇到了 git svn dcommits 问题 导致 git 存储库无法跟踪哪些提交 我尝试确保 git 中的 master 分支始终遵循 SVN 存储库中的 trunk 所以每当我工作时 我都会在一个主题分支上 这是我的场景 在主题分支
  • php 中的长计算会导致 503 错误

    我的脚本需要很长时间才能执行 结果服务器响应 503 错误 如何设置更长的执行时间 在我的 PHP 脚本中我设置 set time limit 0 ignore user abort true 这个问题非常类似于PHP 后台进程 https
  • 将数据库从sql server 2008 r2备份恢复到2008

    我需要将sql server 2008R2上的数据库备份和恢复到sql server 2008 备份文件不兼容这种方式 我发现的另一个选项是生成包含数据的脚本 由于我使用大量外键对数据库进行了规范化 插入会成功吗 还有其他可靠的方法吗 正如
  • Web Audio API:停止播放所有预定的声音

    所以我有一堆加载的音频样本 我在下面的代码中调用调度函数 let audio function playChannel let audioStart context currentTime let next 0 for let i 0 i
  • 如何获取离线安装的所有nuget依赖项

    我使用两台电脑 一台有互联网连接 另一台没有互联网连接 我想在脱机计算机上安装 Nuget 包 Nuget server 及其所有依赖项 不幸的是 仅仅下载软件包本身是不可能的 我必须手动下载所有依赖项 而且有几十个依赖项 如何在具有 In
  • 希望从大量 javascript 文件中删除注释

    这是我的困境 我是一个 javascript 菜鸟 目前正在实习并帮助维护两个电子商务网站 我最近被指派删除我们 javascript 库中出现的所有评论 超过 25 000 条评论 显然我想找到一个函数或一些预先存在的程序 可以解析代码
  • 如何更改滑动(可可)自定义工作表的点?

    我想在我的 Mac 应用程序中使用一个带有自定义高度标题栏的主窗口 例如 sparrow twitter 应用程序 mac 阅读器等 我在用着https github com indragiek INAppStoreWindow https
  • SQL Server Nvarchar 和 Java 准备好的语句

    我有一个关于将字符串插入 SQL Server 2008 R2 的问题 当我尝试插入带有一些国家 地区字母的字符串时 我收到 反而 我知道添加N在字符串文字的开头可以解决这个问题 但我使用的是 JDBC 准备好的语句 如下所示 INSERT
  • Selenium:如何通过部分href查找元素?

    工作代码1 Driver Instance FindElement By XPath a contains href PartialLinkHref 工作代码2 ReadOnlyCollection
  • 如何查找基类库中实现特定接口的类型列表?

    有时我想找出实现特定接口的所有标准 NET 类型的列表 通常是出于好奇 有时也有一些实际目的 但这不是重点 我试图从 MSDN 中获取此内容 但类型的页面仅包含类型的子级链接 而不包含实现接口的类型 您知道如何做到这一点的任何技巧 或有帮助
  • 选择R中n个最远的点

    给定一组 xy 坐标 如何选择 n 个点以使这 n 个点彼此距离最远 一种低效方法可能不适用于大数据集 如下所示 从 1000 个点中找出距离最远的 20 个点 xy lt cbind rnorm 1000 rnorm 1000 n lt
  • 为什么 Retrofit 会在所有 URL 中添加尾部斜杠?

    编辑问题并提供更多详细信息 我了解Retrofit中服务接口的使用 我想调用这样的 URL http a com b c http a com b c 稍后使用服务接口附加查询参数 我的限制是 I cannot使用 b c 作为服务接口的一
  • 在 python 的端到端管道内的数据帧上使用 TimeSeriesSplit() 应用交叉验证的最佳实践是什么?

    假设我有dataset https drive google com file d 18PGLNnOI44LVFignYriBWQFW9WBkTX5c view usp share link在以下范围内pandas questions ta
  • 在系数之间添加乘号 (*)

    我有一个程序 用户在其中输入一个函数 例如sin x 1 我在用着ast尝试通过将组件列入白名单来确定字符串是否 安全 如下所示这个答案 https stackoverflow com a 11952618 4414003 现在我想解析字符