【发布时间】:2020-07-11 17:02:17
【问题描述】:
我是 Python 新手,对正则表达式很不熟悉。 我的要求是修改现有代码中的模式
我已经提取了我要修复的代码。
def replacer_factory(spelling_dict):
def replacer(match):
word = match.group()
return spelling_dict.get(word, word)
return replacer
def main():
repkeys = {'modify': 'modifyNew', 'extract': 'extractNew'}
with open('test.xml', 'r') as file :
filedata = file.read()
pattern = r'\b\w+\b' # this pattern matches whole words only
#pattern = r'[\'"]\w+[\'"]'
#pattern = r'["]\w+["]'
#pattern = '\b[\'"]\w+[\'"]\b'
#pattern = '(["\'])(?:(?=(\\?))\2.)*?\1'
replacer = replacer_factory(repkeys)
filedata = re.sub(pattern, replacer, filedata)
if __name__ == '__main__':
main()
输入
<fn:modify ele="modify">
<fn:extract name='extract' value="Title"/>
</fn:modify>
预期输出。请注意,替换词可以用单引号或双引号括起来。
<fn:modify ele="modifyNew">
<fn:extract name='extractNew' value="Title"/>
</fn:modify>
现有模式r'\b\w+\b' 导致例如<fn:modifyNew ele="modifyNew">,但我正在寻找的是<fn:modify ele="modifyNew">
到目前为止,我尝试的模式以 cmets 的形式给出。我很晚才意识到其中几个是错误的,前缀为 r 的字符串文字用于特殊处理反斜杠等。我仍然将它们包括在内,以回顾我迄今为止所做的任何尝试。
如果我能找到一种模式来解决这个问题,而不是改变逻辑,那就太好了。如果现有代码无法实现这一点,请同时指出。我工作的环境有Python 2.6
感谢任何帮助。
【问题讨论】:
-
注意
pattern = r'\b\w+\b'=pattern = r'\w+' -
所以,您说要替换的词 可以 括在单引号或双引号中,但您的意思是说它们 必须用引号括起来?
-
@WiktorStribiżew 是的。要替换的单词总是在引号内(单引号或双引号)。
标签: python regex python-2.6