camelCase to sed中的snake_case用于格式错误的python代码

时间:2015-01-09 12:12:20

标签: python regex sed

我有一些用camelCase编写的python代码,但根据PEP 8变量名称应该用snake_case编写。我写了一个小的sed脚本,设法取任何小写字母\ 1,然后是大写字母\ 2,然后把它变成\ 1_和小写\ 2

find . -iname \*.py | xargs sed -i "s/\([a-z]\)\([A-Z]\)/\1_\L\2/g"

然而,这会将 CamelCase 变成Camel_case。根据相同的PEP 8标准类名称应该以CamelCase编写,以大写字母开头。

如何编写一个不接触CamelCase的sed脚本,但将 camelCamelCamelCamel ... 翻译成 camel_camel_camel_camel ...

我有一种感觉,我正在达到正则表达式的限制,因为我必须保持单词的上下文以小写字母开头,表示未知数量的“驼峰”。我知道我可以在另一个工具中执行此操作,但我想知道sed是否可以执行此操作。认为这是不可能的论证也足够了。

我正在使用GNU sed 4.2.2

2 个答案:

答案 0 :(得分:1)

其中一条评论提及autopep8,这可能是OP的方法,但在sed中尝试这一点是有益的(我的意思是它是一个有趣的谜题)。

有可能:

sed -r ':loop; /.*\<([a-z]+([A-Z][a-z]+)+)\>.*/ { h; s//\1/; s/([A-Z])/_\l\1/g; G; s/(.*)\n(.*)\<[a-z]+([A-Z][a-z]+)+\>(.*)/\2\1\4/; b loop }'

代码是

:loop
/.*\<([a-z]+([A-Z][a-z]+)+)\>.*/ {
  h
  s//\1/
  s/([A-Z])/_\l\1/g
  G
  s/(.*)\n(.*)\<[a-z]+([A-Z][a-z]+)+\>(.*)/\2\1\4/
  b loop
}

在这里,\<[a-z]+([A-Z][a-z]+)+\>匹配单独的一个单独的词条。 \<\>是字边界,以确保此符合此类字词。所以这就是循环:

  1. 如果该行包含dromedaryCase术语:
  2. 将整行保存到保留缓冲区
  3. 隔离dromedaryCase术语。这使用//重用最后一个正则表达式的事实,即1中的正则表达式。
  4. 将所有大写字母替换为_,后跟小写对应(使用GNU扩展名\l;否则您需要y/ABCDEF.../abcdef.../命令才能更改案件)。模式空间现在包含与dromedaryCase术语相对应的snake_case。
  5. 将原始行从保留缓冲区附加到模式空间
  6. 在原始正则表达式的基础上,将模式空间拆分为相关部分:\1是snake_case术语,\2是替换部分\4之前原始行的一部分是单峰骆驼术语之后的部分。然后按正确的顺序重新组装这些部件。
  7. 循环,直到替换行中的所有dromedaryCase术语。

答案 1 :(得分:0)

试试这个:

result = re.sub("([A-Z])", r"_\1", text, 0, re.MULTILINE)