从 python 复杂的可执行字符串中删除前导零

Remove leading zeros from python complex executable string

我正在 Python 3.7 上使用语法进化 (GE)。 我的语法生成以下格式的可执行字符串:

np.where(<variable> <comparison_sign> <constant>, (<probability1>), (<probability2>))

然而,字符串可能会变得相当复杂,有几个链式 np.where .

<constant> 在某些情况下包含前导零,这会使可执行字符串产生错误。 GE 应该生成包含前导零的表达式,但是,我必须检测删除 它们。 包含前导零的可能解决方案示例:

"np.where(x < 02, np.where(x > 01.5025, (0.9), (0.5)), (1))"

问题:

我用不同的 re 模式进行了多次尝试,但无法解决。 为了检测可执行字符串是否包含前导零,我使用:

try:
  _ = eval(expression)
except SyntaxError:
  new_expression = fix_expressions(expression)

我需要帮助构建 fix_expressions Python 函数。

您可以使用 .lstrip()

删除字符串中的前导 0
str_num = "02.02025"

print("Initial string: %s \n" % str_num)

str_num = str_num.lstrip("0")

print("Removing leading 0's with lstrip(): %s" % str_num)

您可以尝试为带前导零的数字想出一个正则表达式,然后替换前导零。

import re

def remove_leading_zeros(string):
    return re.sub(r'([^\.^\d])0+(\d)', r'', string)

print(remove_leading_zeros("np.where(x < 02, np.where(x > 01.5025, (0.9), (0.5)), (1))"))

# output: np.where(x < 2, np.where(x > 1.5025, (0.9), (0.5)), (1))

remove_leading_zeros 函数基本上找到所有出现的 [^\.^\d]0+\d 并删除零。 [^\.^\d]0+\d 不是数字,也不是后跟至少一个零后跟数字的点。正则表达式中的括号 () 表示 capture groups,用于保留前导零之前的字符和之后的数字。


关于 Csaba Toth 的评论:

02+03*04 的问题是字符串的开头有一个零。 可以 modify the regex 这样它也匹配第一个捕获组中字符串的开头:

r"(^|[^\.^\d])0+(\d)"