我有這個函式用它的正則運算式對應物替換字典值中的命名規則,如#digit#:[0-9)
例如,呼叫這個函式:
def expand_re(pat_dict:{str:str}):
pat_list = list(pat_dict.items())
for key, rule in pat_dict.items():
expression = re.compile(r'#\w #')
pat_dict[key] = re.sub(expression, f"(?:{pat_list[0][1]})", rule)
return pat_dict
在這本詞典上:
pd = dict(digit = r'[0-9]', integer = r'[ -]?#digit##digit#*')
會產生:
{'digit': '[0-9]', 'integer': '[ -]?(?:[0-9])(?:[0-9])*'}
它作業得很好。但是,如果字典開始使用前一個值的命名規則,則它不起作用。所以在字典上呼叫 expand_re :
pd = dict(a='correct',b='#a#',c='#b#',d='#c#',e='#d#',f='#e#',g='#f#')
我的功能產生:
{'a': 'correct',
'b': '(?:correct)',
'c': '(?:correct)',
'd': '(?:correct)',
'e': '(?:correct)',
'f': '(?:correct)',
'g': '(?:correct)'
}
當我希望它產生時:
{'a': 'correct',
'b': '(?:correct)',
'c': '(?:(?:correct))',
'd': '(?:(?:(?:correct)))',
'e': '(?:(?:(?:(?:correct))))',
'f': '(?:(?:(?:(?:(?:correct)))))',
'g': '(?:(?:(?:(?:(?:(?:correct))))))'
}
我怎么能做到這一點?我試過使用字典的 .update() 方法,但無濟于事。
uj5u.com熱心網友回復:
這是您的代碼的修復程式,可以按您的需要作業。請注意,雖然邏輯是相同的,但它存在按順序替換鍵的缺陷。這意味著如果鍵被洗牌,它不會做你想要的。
import re
def expand_re(pat_dict:{str:str}):
expression = re.compile(r'#(\w )#')
for key in pat_dict:
pat_dict[key] = re.sub(expression, lambda x: f"(?:{pat_dict[x.group(1)]})", pat_dict[key])
return pat_dict
d = dict(a='correct',b='#a#',c='#b#',d='#c#',e='#d#',f='#e#',g='#f#')
expand_re(d)
輸出:
{'a': 'correct',
'b': '(?:correct)',
'c': '(?:(?:correct))',
'd': '(?:(?:(?:correct)))',
'e': '(?:(?:(?:(?:correct))))',
'f': '(?:(?:(?:(?:(?:correct)))))',
'g': '(?:(?:(?:(?:(?:(?:correct))))))'}
演示邏輯中(潛在)缺陷的示例
>>> expand_re(dict(a='correct',b='#a#',c='#b#',e='#d#',d='#c#',f='#e#',g='#f#'))
{'a': 'correct',
'b': '(?:correct)',
'c': '(?:(?:correct))',
'e': '(?:#c#)',
'd': '(?:(?:(?:correct)))',
'f': '(?:(?:#c#))',
'g': '(?:(?:(?:#c#)))'}
沒有正則運算式的版本
def expand_re(pat_dict:{str:str}):
for key, value in pat_dict.items():
if value.startswith('#') and value.endswith('#') and value[1:-1] in pat_dict:
pat_dict[key] = f'(?:{pat_dict[value[1:-1]]}'
return pat_dict
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/322858.html
上一篇:我如何將目錄結構重建到字典中?
下一篇:將主要游戲回圈轉化為功能
