Python 替换单引号或双引号之间单词的模式
Python pattern to replace words between single or double quotes
我是 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 = '(["\'])(?:(?=(\?)).)*?'
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">
到目前为止我尝试过的模式已作为评论给出。我后来意识到他们中的一些是错误的,因为以 r
为前缀的字符串文字用于反斜杠等的特殊处理。我仍然包括他们来回顾我到目前为止所做的一切。
如果我能得到一个模式来解决这个问题,而不是改变逻辑,那就太好了。如果用现有的代码无法做到这一点,也请指出。我工作的环境有Python2.6
感谢任何帮助。
您需要使用 r'''(['"])(\w+)'''
正则表达式,然后您需要调整替换方法:
def replacer_factory(spelling_dict):
def replacer(match):
return '{0}{1}{0}'.format(match.group(1), spelling_dict.get(match.group(2), match.group(2)))
return replacer
您与 (['"])(\w+)
匹配的单词是双引号或单引号,但该值在第 2 组中,因此使用 spelling_dict.get(match.group(2), match.group(2))
。此外,引号必须放回去,因此 '{0}{1}{0}'.format()
.
参见 Python demo:
import re
def replacer_factory(spelling_dict):
def replacer(match):
return '{0}{1}{0}'.format(match.group(1), spelling_dict.get(match.group(2), match.group(2)))
return replacer
repkeys = {'modify': 'modifyNew', 'extract': 'extractNew'}
pattern = r'''(['"])(\w+)'''
replacer = replacer_factory(repkeys)
filedata = """<fn:modify ele="modify">
<fn:extract name='extract' value="Title"/>
</fn:modify>"""
print( re.sub(pattern, replacer, filedata) )
输出:
<fn:modify ele="modifyNew">
<fn:extract name='extractNew' value="Title"/>
</fn:modify>
我是 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 = '(["\'])(?:(?=(\?)).)*?'
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">
到目前为止我尝试过的模式已作为评论给出。我后来意识到他们中的一些是错误的,因为以 r
为前缀的字符串文字用于反斜杠等的特殊处理。我仍然包括他们来回顾我到目前为止所做的一切。
如果我能得到一个模式来解决这个问题,而不是改变逻辑,那就太好了。如果用现有的代码无法做到这一点,也请指出。我工作的环境有Python2.6
感谢任何帮助。
您需要使用 r'''(['"])(\w+)'''
正则表达式,然后您需要调整替换方法:
def replacer_factory(spelling_dict):
def replacer(match):
return '{0}{1}{0}'.format(match.group(1), spelling_dict.get(match.group(2), match.group(2)))
return replacer
您与 (['"])(\w+)
匹配的单词是双引号或单引号,但该值在第 2 组中,因此使用 spelling_dict.get(match.group(2), match.group(2))
。此外,引号必须放回去,因此 '{0}{1}{0}'.format()
.
参见 Python demo:
import re
def replacer_factory(spelling_dict):
def replacer(match):
return '{0}{1}{0}'.format(match.group(1), spelling_dict.get(match.group(2), match.group(2)))
return replacer
repkeys = {'modify': 'modifyNew', 'extract': 'extractNew'}
pattern = r'''(['"])(\w+)'''
replacer = replacer_factory(repkeys)
filedata = """<fn:modify ele="modify">
<fn:extract name='extract' value="Title"/>
</fn:modify>"""
print( re.sub(pattern, replacer, filedata) )
输出:
<fn:modify ele="modifyNew">
<fn:extract name='extractNew' value="Title"/>
</fn:modify>