我试图使用pycharm的“文件替换”功能注解掉特定出现的代码。
具体而言,我希望以下内容被注解掉:
if TYPE_CHECKING:
from foo import bar
from x import y
因此,它可以替换为:
# if TYPE_CHECKING:
# from foo import bar
# from x import y
我需要这个,因为我正在使用 pydeps
,在编写本文时,它似乎没有在类型_checking-guard下忽略导入的选项。对于我正在进行的项目来说,手动注解这些内容是乏味的。
现在我正在使用这个正则表达式,它与预期相符: (^if TYPE_CHECKING:\n)(^\s+from.?)+
我正试图用以下方法替换它: #$1#$2
我没想到这会奏效,因为我认为2美元应该只与第二组的第一次匹配。
另一种方法是简单地替换以 if TYPE_CHECKING:
或 \s+from.+\n
单独使用,例如:
(^if TYPE_CHECKING:\n|^\s+from.+\n)+
然后简单地用 $1
. 只要其他“来自”导入之前没有空格,此选项就有效。不过,这也会替换注解中出现的情况或已注解掉的代码(我知道这可能被认为是不好的做法,但我正在寻找一种方法,以使这项工作稳健地进行)。
有人会对一种方法提出建议吗?
1条答案
按热度按时间jm81lzqq1#
一个选项(如果支持)可以使用
\G
锚定。在替换使用中#然后使用
#$0
```(?:^if TYPE_CHECKING:\R|\G(?!\A)^[^\S\r\n](?: from .)?(?:\R|$))
if TYPE_CHECKING:
from foo import bar
from x import y
^if TYPE_CHECKING:(?:\n\sfrom .)*
import re
pattern = r"^if TYPE_CHECKING:(?:\n\sfrom .)*"
s = ("if TYPE_CHECKING:\n"
" from foo import bar\n"
" from x import y")
res = re.sub(pattern, lambda x: re.sub(r"^", "#", x.group(), 0, re.MULTILINE), s)
print(res)
if TYPE_CHECKING:
from foo import bar
from x import y