通过pycharm中的正则表达式搜索和替换操作注解特定的python代码

prdp8dxp  于 2021-09-08  发布在  Java
关注(0)|答案(1)|浏览(486)

我试图使用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 . 只要其他“来自”导入之前没有空格,此选项就有效。不过,这也会替换注解中出现的情况或已注解掉的代码(我知道这可能被认为是不好的做法,但我正在寻找一种方法,以使这项工作稳健地进行)。
有人会对一种方法提出建议吗?

jm81lzqq

jm81lzqq1#

一个选项(如果支持)可以使用 \G 锚定。
在替换使用中#然后使用 #$0 ```
(?:^if TYPE_CHECKING:\R|\G(?!\A)^[^\S\r\n](?: from .)?(?:\R|$))

模式匹配: `(?:` 非捕获组 `^if TYPE_CHECKING:\R` 匹配 `if TYPE_CHECKING:` 还有一行开头的新行 `|` 或 `\G(?!\A)` 在上一个匹配的末尾而不是字符串的开头Assert位置 `^[^\S\r\n]*` 匹配从行首起没有换行符的可选空格 `(?: from .*)?` 可选地将一行与from匹配(如果存在空行,则将其交叉) `(?:\R|$)` 匹配换行符或Assert行的结尾 `)` 关闭非捕获组
正则表达式演示
输出

if TYPE_CHECKING:

from foo import bar

from x import y

使用代码的选项:
可以匹配以空格和from开头的所有行,并将字符串的所有开头替换为#。

^if TYPE_CHECKING:(?:\n\sfrom .)*

模式匹配: `^` 字符串开头 `if TYPE_CHECKING:` 逐字匹配 `(?:` 非捕获组作为一个整体重复 `\n\s*from .*` 匹配换行符,可选空格字符,匹配 `from` 剩下的呢 `)*` 关闭非捕获组
正则表达式演示
例如

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

相关问题