求助修正正则:定位含无效转义序列的非原始字符串
修正匹配Flake8 W605无效转义序列的正则
你的原始正则(?<!r)(["'])(.*?)[\\](.*?)(["'])会出现跨字符串匹配的问题,核心原因是.*?会匹配任意字符(包括其他字符串的引号),没考虑字符串内部只能包含转义后的引号或非引号字符。
修正后的正则模式
(?<!r)(["'])(?:(?!\1)[^\\]|\\.)*?\\(?:(?!\1)[^\\]|\\.)*?\1
正则各部分解释
(?<!r):断言字符串开头没有r,排除原始字符串(["']):捕获当前字符串的引号类型(单/双引号),后续用\1引用(?:(?!\1)[^\\]|\\.)*?:匹配字符串内容,规则是:- 要么是不是当前引号且不是反斜杠的普通字符
- 要么是任意转义字符(比如
\'、\")
非贪婪匹配,直到遇到第一个未转义的反斜杠
\\:匹配导致W605的无效转义反斜杠(?:(?!\1)[^\\]|\\.)*?\1:继续匹配到字符串结束的未转义引号,确保不会跨到下一个字符串
测试验证
- 符合预期的场景:
test1 = re.compile('^(.*?)\test1?$', re.S) # 匹配正确 test2 = re.compile(r'^(.*?)\test2?$', re.S) # 不匹配(原始字符串,符合预期) test3 = re.compile("^(.*?)\test3?$", re.S) # 匹配正确 test4 = re.compile(r"^(.*?)\test4?$", re.S) # 不匹配(原始字符串,符合预期) - 之前错误匹配的场景:
现在只会匹配test5.setdefault('test5', re.search('^(.*?)\test5?$', '').groups()[0])'^(.*?)\test5?$',不会错误包含前面的'test5'
替换逻辑
把匹配到的内容替换为r\1...\1,也就是在引号前添加r,比如将'^(.*?)\test1?$'替换为r'^(.*?)\test1?$'
内容的提问来源于stack exchange,提问作者Tony Montana
相关产品推荐
相关产品推荐

