[英]Split strings using regular expression and evaluate it
我有一個包含一些變量,算術和邏輯運算符的字符串。 我的問題陳述是替換變量的值並求值並發送True或False
我的字串:
'ABC >= 55 and Xyz <= 5500 or ABCDe == 900 or xYz == 30'
在這里,ABC,Xyz和ABCDe是動態的,可以是任何東西。 我需要從str1中獲取這些變量的值,並像下面這樣評估
eval( 100 >= 55 and 555 <= 5500 or 50 == 900 or 10 == 30)
我已經嘗試了以下方法,
def replace(match):
return '{}'.format(10)
re.sub(r'[a-b|A-Z]\w+',replace, str1)
輸出:
'10 >= 55 10 10 <= 5500 or 10 == 900 or x10 == 30'
這里的問題是它替換'and','或'也替換是不正確的,它替換了xYz as x10
然后我嘗試用特殊字符替換那些
>> str2 = str1.replace('and', '&').replace('or', '|')
>> print str2
>> ABC >= 55 & Xyz <= 5500 | ABCDe == 900 | xYz == 30
>> re.sub(r'[a-b|A-Z]\w+',replace, str2)
它解決了替換運算符但不區分大小寫的問題
'10 >= 55 & 10 <= 5500 | 10 == 900 | x10 == 30'
有人可以以此或其他任何方式幫助我嗎?
我看到的一個問題是您的replace函數始終返回10:
return '{}'.format(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
\\ b使其完全匹配,因此ABC不會匹配ABCDe
從my_string = 'ABC >= 55 and Xyz <= 5500 or ABCDe == 900 or xYz == 30'
。 我將假定此字符串應該是有效的Python表達式。
我假設您有一個名為variable_values的字典:
variable_values = {'ABC': 10, 'Xyz': 555, 'ABCDe': 50, 'xYz': 10}
您必須擁有某種東西,因為否則您將不知道要替代什么。
步驟1.替換變量名的值。 您不能簡單地通過使用string.replace()
來完成此操作,因為如果您有兩個變量ABC
和ABCABC
,並且ABC
的值為100
,那么天真的替換將用100100
的值替換為ABCABC
,這可能是不正確的。 因此,堅持要求變量名必須以word_boundary開頭和結尾。
for name, value in variable_values.items():
my_string = re.sub(fr"\b{name}\b",str(value),my_string)
步驟2.現在my_string
的值為'10 >= 55 and 555 <= 5500 or 50 == 900 or 10 == 30'
。 對其調用eval()
。
>>> 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
有沒有更好,更有效的方法來做到這一點
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.