簡體   English   中英

使用正則表達式分割字符串並對其求值

[英]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()來完成此操作,因為如果您有兩個變量ABCABCABC ,並且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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM