首页 > 编程问答 >使用正则表达式和 Polars 有效解析公式

使用正则表达式和 Polars 有效解析公式

时间:2024-07-24 06:02:35浏览次数:13  
标签:python regex python-polars text-extraction

我正在尝试解析一系列数学公式,并且需要使用 Python 中的 Polars 有效地提取变量名称。 Polars 中的正则表达式支持似乎很有限,特别是对于环视断言。 有没有一种简单、有效的方法来解析公式中的符号?

这是我的代码片段:

import re
import polars as pl

# Define the regex pattern
FORMULA_DECODER = r"\b[A-Za-z][A-Za-z_0-9_]*\b(?!\()"
# \b          # Assert a word boundary to ensure matching at the beginning of a word
# [A-Za-z]    # Match an uppercase or lowercase letter at the start
# [A-Za-z0-9_]* # Match following zero or more occurrences of valid characters (letters, digits, or underscores)
# \b          # Assert a word boundary to ensure matching at the end of a word
# (?!\()      # Negative lookahead to ensure the match is not followed by an open parenthesis (indicating a function)

# Sample formulas
formulas = ["3*sin(x1+x2)+A_0",
            "ab*exp(2*x)"]

# expected result
pl.Series(formulas).map_elements(lambda formula: re.findall(FORMULA_DECODER, formula), return_dtype=pl.List(pl.String))
# Series: '' [list[str]]
# [
#   ["x1", "x2", "A_0"]
#   ["ab", "x"]
# ]

# Polars does not support this regex pattern
pl.Series(formulas).str.extract_all(FORMULA_DECODER)
# ComputeError: regex error: regex parse error:
#     \b[A-Za-z][A-Za-z_0-9_]*\b(?!\()
#                               ^^^
# error: look-around, including look-ahead and look-behind, is not supported

由于Polars不支持环视断言,我们可以通过应用两次正则表达式来解决这个问题:

import polars as pl

# Define the regex patterns
FORMULA_DECODER = r"\b[A-Za-z][A-Za-z_0-9_]*\b"  # Extract all potential variables
FUNCTION_CALL = r"[A-Za-z_][A-Za-z0-9_]*\("  # Detect function calls

# Sample formulas
formulas = ["3*sin(x1+x2)+A_0",
            "ab*exp(2*x)"]

df = pl.DataFrame({"formula": formulas})

df = (
    df
    .with_column(
        pl.col("formula")
        .str.extract_all(FORMULA_DECODER)
        .alias("potential_variables")
    )
    .with_column(
        pl.col("formula")
        .str.extract_all(FUNCTION_CALL)
        .alias("functions")
    )
)

def filter_variables(row):
    potential_variables = row["potential_variables"]
    functions = row["functions"]
    if potential_variables is None or functions is None:
        return None
    variables = [var for var in potential_variables if var not in functions]
    return variables

df = df.with_column(
    pl.struct(["potential_variables", "functions"])
    .apply(lambda row: filter_variables(row))
    .alias("variables")
).select("formula", "variables")

print(df)

这段代码执行以下操作:

  1. 定义两个正则表达式:
  2. FORMULA_DECODER :这与之前的模式相同,但没有环视断言。它提取所有看起来像变量的东西。
  3. FUNCTION_CALL :这个模式检测函数调用,捕获函数名称及其开括号。

  4. 使用 extract_all 提取潜在变量和函数调用。

  5. 创建一个新列 variables

  6. 使用 with_column apply 迭代每一行。
  7. 对于每一行,它都会检查 potential_variables 列表中是否存在任何元素,这些元素也包含在 functions 列表中。如果是这样,则表示该变量实际上是一个函数调用,并且从结果中将其删除。

  8. 最后,它打印出包含公式及其提取变量的数据框。

这种方法通过首先提取所有潜在变量,然后过滤掉函数调用来避免使用环视断言。这是一种在Polars中实现所需结果的更有效且更易读的方法。

标签:python,regex,python-polars,text-extraction
From: 78785661

相关文章

  • 尝试使用 pyinstaller 将 python 文件转换为可执行文件时出现 TypeError
    稍后的目的是通过命令行向GPT4all发送问题并将答案存储在文本文档中。我想将阻止代码转换为exe,但它产生了TypeError。这是到目前为止的代码:fromgpt4allimportGPT4Allmodel=GPT4All("Meta-Llama-3-8B-Instruct.Q4_0.gguf",device='cpu')#downloads/loads......
  • 使用 Python-PlexAPI 获取 plex 上所有好友的关注列表
    有关如何接收我的plex服务器上所有用户的监视列表的任何提示。我正在根据一些规则创建自动删除,其中一个规则是,如果电影位于用户观看列表中,则不应删除该电影。我遇到了麻烦,因为所有与观看列表相关的内容都在MyPlexAccount上。lexapi.myplex.MyPlexAccount具有我的用......
  • 如何在 Python 中查看与 Azure OpenAI 助手关联的所有上传文件?
    我正在使用Python对文档中的问题进行基准测试,并在jupyter笔记本中实例化了我的助手。我想确认助手是否有我上传的文件,但似乎找不到有关此功能将使用什么功能的文档。使用适用于AzureOpenAI的最新版本的PythonAPI。目前,无法使用AzureOpenAI的PythonAPI直接查看......
  • 如何在Python中计算小数?
    我正在创建一个计算器来用python计算企业的利润,但到目前为止我只能使用整数。这是我的代码示例:Gross=int(input("PleaseentertotalGrossRevenuefortheFiscalYear"))NetTaxes=int(Gross)*0.1所以我将会计年度的总收入乘以按“税率”计算,但我只能使用......
  • 如何使用 Python 打开 Google Firestore 上的特定数据库?
    我正在使用Firebase并使用以下代码从Firestore设置/检索文档:importfirebase_adminfromfirebase_adminimportcredentials,firestorecred=credentials.ApplicationDefault()firebase_admin.initialize_app(cred,options={"projectId":"huq-jimbo"})fires......
  • 如何使用 Python 和 Numpy 重现 Matlab 文件读取以解码 .dat 文件?
    我有一个Matlab脚本,可以读取编码的.dat文件,对其进行解码并保存。我试图使用numpy将其转换为Python。我发现对于同一个文件,我得到不同的输出结果(python数字没有意义)。该代码最初作为从串行端口读取的脚本的一部分运行,因此是数据的结构。我首先认为位移是问题所在,因为......
  • 在Python中调整pdf页面大小
    我正在使用python裁剪pdf页面。一切正常,但如何更改页面大小(宽度)?这是我的裁剪代码:input=PdfFileReader(file('my.pdf','rb'))p=input.getPage(1)(w,h)=p.mediaBox.upperRightp.mediaBox.upperRight=(w/4,h)output.addPage(p)当我裁剪页面时,我也需要......
  • 如何使用 python 更改资源管理器窗口中的路径?
    没有人知道如何在不使用python打开新实例的情况下更改资源管理器窗口中的当前路径吗?例如,如果用户使用C:\Users\User打开资源管理器窗口。然后我必须将该路径更改为C:\Windows\System32例如。提前致谢。很遗憾,无法直接使用Python更改现有文件资源管理器窗口的......
  • python 以及将数组传递给函数的问题
    我需要求解一些常微分方程$\frac{dy}{dx}=f(x)=x^2ln(x)$并继续在限制0之间创建数组xpt。<=xpt<=2因为我必须小心xpt=0,所以我将函数定义如下deff(x):ifx<=1.e-6:return0.else:returnnp.square(x)*np.log(x)我的调用程序读取Np......
  • 如果 Python 脚本正在使用文件夹,如何在文件资源管理器中进行更改时防止 Windows 的“
    我有一个简单的脚本,显示在QTreeView中的QListView中选择的目录的内容,我想添加打开文件资源管理器的功能,以让用户编辑目录内的内容。但是,添加新的文件夹和文件可以,但删除或移动文件夹或文件会提示“文件夹正在使用”错误:此操作无法完成,因为该文件已在另一个程......