Python 使用正则表达式拆分字符串并对其求值

Python 使用正则表达式拆分字符串并对其求值,python,regex,string,Python,Regex,String,我有一个字符串,其中包含一些变量、算术和逻辑运算符。我的问题陈述是替换变量的值并对其求值,然后发送True或False 我的字符串: 'ABC >= 55 and Xyz <= 5500 or ABCDe == 900 or xYz == 30' 输出: '10 >= 55 10 10 <= 5500 or 10 == 900 or x10 == 30' 它解决了运算符的替换问题,但没有解决区分大小写的问题 '10 >= 55 & 10 <= 55

我有一个字符串,其中包含一些变量、算术和逻辑运算符。我的问题陈述是替换变量的值并对其求值,然后发送True或False

我的字符串:

'ABC >= 55 and Xyz <= 5500 or ABCDe == 900 or xYz == 30'
输出:

'10 >= 55 10 10 <= 5500 or 10 == 900 or x10 == 30'
它解决了运算符的替换问题,但没有解决区分大小写的问题

'10 >= 55 & 10 <= 5500 | 10 == 900 | x10 == 30'

'10>=55&10我看到的一个问题是替换函数总是返回10:

return '{}'.format(10) 
将始终返回10,这就是字符串不正确的原因

我看到的另一件事是,您没有指示哪个值指向哪个动态变量

我能够用以下代码解决这个问题:(快速而粗略地键入)

重新导入
代表散列={
r'ABC\b':'100',
r'Xyz\b':'555',
r'ABCDe\b':'50',
r'xYz\b':'10'
}

str1='ABC>=55和Xyz我看到的一个问题是替换函数总是返回10:

return '{}'.format(10) 
将始终返回10,这就是字符串不正确的原因

我看到的另一件事是,您没有指示哪个值指向哪个动态变量

我能够用以下代码解决这个问题:(快速而粗略地键入)

重新导入
代表散列={
r'ABC\b':'100',
r'Xyz\b':'555',
r'ABCDe\b':'50',
r'xYz\b':'10'
}

str1='ABC>=55和Xyz以
my_string='ABC>=55和Xyz以
my_string='ABC>=55和Xyz开始,不知何故使它在下面工作

def replace(match):
    return '{}'.format(10)

my_string = 'ABC >= 55 and Xyz <= 5500 or ABCDe == 900 or xYz == 30'

string2 = my_string.replace('and', '&').replace('or', '|')

eval(re.sub(r'[a-zA-Z]\w+\b',replace, string2))
# False
def更换(匹配):
返回{}。格式(10)

我的字符串='ABC>=55和Xyz以某种方式使它在下面工作

def replace(match):
    return '{}'.format(10)

my_string = 'ABC >= 55 and Xyz <= 5500 or ABCDe == 900 or xYz == 30'

string2 = my_string.replace('and', '&').replace('or', '|')

eval(re.sub(r'[a-zA-Z]\w+\b',replace, string2))
# False
def更换(匹配):
返回{}。格式(10)


我的字符串='ABC>=55和Xyz我正在努力解释你想做什么,我的第一个问题是你想用
=
还是
=
?后者将返回true/false,前者将变量ABCDe赋值为900Yes。它将是==您如何知道哪些变量有哪些值?你一定在某个地方有一个变量列表,对吗?您是否可以遍历该列表并替换特定的变量,而不是使用正则表达式来查找所有类似单词的字符串?这些变量存在于db中,或者存在于某些属性文件中,这些属性文件将使用
def replace(match):返回“{}”。format(10)
而不是
format(10)
我会打电话去拿它。我正在努力解释你想做什么,我的第一个问题是你想用
=
还是
=
?后者将返回true/false,前者将变量ABCDe赋值为900Yes。它将是==您如何知道哪些变量有哪些值?你一定在某个地方有一个变量列表,对吗?您是否可以遍历该列表并替换特定的变量,而不是使用正则表达式来查找所有类似单词的字符串?这些变量存在于db中,或者存在于某些属性文件中,这些属性文件将使用
def replace(match):返回“{}”。format(10)
而不是
format(10)
我会打电话去拿。谢谢你的回答。我有一个字符串不是作为dict的。
my_string='ABC>=55和Xyz我知道这一点。如果您查看答案,您将看到
my_string
与此一模一样。但是
ABC
应该有
10
的值,对吗?该值
10
必须来自某个地方。你没说你从哪里得到的。一个
dict
是显而易见的解决方案。
my_string
与我需要计算的字符串完全相同,但是
variable_值
我需要通过从输入字符串传递提取的变量名来从数据库中获取,并获取值并替换它。例如,
get_值('ABCDe')
Ah。这还不清楚。你没说数据库的事。在这种情况下,您必须对表达式进行正确的解析。谢谢您的回答。我有一个字符串不是作为dict的。
my_string='ABC>=55和Xyz我知道这一点。如果您查看答案,您将看到
my_string
与此一模一样。但是
ABC
应该有
10
的值,对吗?该值
10
必须来自某个地方。你没说你从哪里得到的。一个
dict
是显而易见的解决方案。
my_string
与我需要计算的字符串完全相同,但是
variable_值
我需要通过从输入字符串传递提取的变量名来从数据库中获取,并获取值并替换它。例如,
get_值('ABCDe')
Ah。这还不清楚。你没说数据库的事。在这种情况下,您必须对表达式进行正确的解析。谢谢您的回答。我总是返回
返回'{}'。格式(10)
,作为替换它的占位符。实际上,我将调用其他一些实现来获取这些值。谢谢您的回答。我总是返回
返回'{}'。格式(10)
,作为替换它的占位符。实际上,我将调用其他一些实现来获取这些值。
import re

rep_hash = {
    r'ABC\b' : '100',
    r'Xyz\b' : '555',
    r'ABCDe\b' : '50',
    r'xYz\b' : '10'
}

str1 = 'ABC >= 55 and Xyz <= 5500 or ABCDe == 900 or xYz == 30'
str2 = ''
for item in rep_hash:
    str1 = re.sub(item, rep_hash[item], str1)

print str1
variable_values = {'ABC': 10, 'Xyz': 555, 'ABCDe': 50, 'xYz': 10} 
for name, value in variable_values.items():
    my_string = re.sub(fr"\b{name}\b",str(value),my_string)
>>> eval(my_string)
False
def replace(match):
    return '{}'.format(10)

my_string = 'ABC >= 55 and Xyz <= 5500 or ABCDe == 900 or xYz == 30'

string2 = my_string.replace('and', '&').replace('or', '|')

eval(re.sub(r'[a-zA-Z]\w+\b',replace, string2))
# False