我正在使用notepad++,并使用它的“查找-替换”对话框。
NP++文档声明: Notepad++正则表达式使用Boost正则表达式库v1.70,该库基于PCRE (Perl兼容正则表达式)语法。参考文献:https://npp-user-manual.org/docs/searching
我试图做的事情应该很简单,但我是一个regex新手,经过2-3个小时的网络搜索和与在线regex测试人员的游戏,我放弃了。
我想将所有单引号'替换为双引号",但当且仅当'位于一个或多个'的右边(即在python注释中)。例如,
list1 = ['apple','banana','pear'] # All 'single quotes' to LEFT of # remained unchanged.
list2 = ['tomato','carrot'] # All 'single quotes' to RIGHT of one or more # are replaced
# # with "double quotes", like this. np++文件超过800行,手动替换将非常繁琐和容易出错。谢谢你的建议。
发布于 2020-02-08 22:08:37
这个regex应该做你想做的事:
(^[^#]*#|(?<!^)\G)[^'\n]*\K'它寻找一个',它的前面有两个
^[^#]*#:行的开始和一些非#字符,后面跟着一个#;或(?<!^)\G:行的开始或上一次匹配的结束(\G),对行(?<!^)的开始有负的查找,这意味着它仅在上一次匹配的末尾匹配。然后是一些非'或换行符(以防止匹配环绕在上一行的末尾)字符[^'\n]*。
然后,我们使用\K重置匹配,以便从匹配中丢弃之前的所有内容,并且regex只匹配'。
然后,可以用"替换它。
更新
您可以避免在单词中匹配撇号,只匹配前面或后面有一个非单词字符的撇号:
(^[^#]*#|(?<!^)\G)[^'\n]*\K('(?=\W)|(?<=\W)')更新2
您还可以处理字符串中存在#字符的情况,方法是将正则表达式的第一部分限定为预先有匹配的引号对:
(?:^[^'#]*(?:'[^']*'[^#']*)*[^'#]*#|(?<!^)\G)[^'\n]*\K(?:'(?=\W)|(?<=\W)')https://stackoverflow.com/questions/60131387
复制相似问题