我有一些用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
答案 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中的正则表达式。_
,后跟小写对应(使用GNU扩展名\l
;否则您需要y/ABCDEF.../abcdef.../
命令才能更改案件)。模式空间现在包含与dromedaryCase术语相对应的snake_case。\1
是snake_case术语,\2
是替换部分\4
之前原始行的一部分是单峰骆驼术语之后的部分。然后按正确的顺序重新组装这些部件。答案 1 :(得分:0)
试试这个:
result = re.sub("([A-Z])", r"_\1", text, 0, re.MULTILINE)