从 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))"
问题:
- 有两种类型的数字包含前导零:int 和 float。
- 假设我在字符串中检测到“02”。如果我将字符串中出现的所有位置从“02”替换为“2”,浮点数“01.5025”也将更改为“01.525”,这是不可能发生的。
我用不同的 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)"
我正在 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))"
问题:
- 有两种类型的数字包含前导零:int 和 float。
- 假设我在字符串中检测到“02”。如果我将字符串中出现的所有位置从“02”替换为“2”,浮点数“01.5025”也将更改为“01.525”,这是不可能发生的。
我用不同的 re
模式进行了多次尝试,但无法解决。
为了检测可执行字符串是否包含前导零,我使用:
try:
_ = eval(expression)
except SyntaxError:
new_expression = fix_expressions(expression)
我需要帮助构建 fix_expressions
Python 函数。
您可以使用 .lstrip()
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)"