Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sed中camelCase到snake_的大小写,用于格式错误的python代码_Python_Regex_Sed - Fatal编程技术网

sed中camelCase到snake_的大小写,用于格式错误的python代码

sed中camelCase到snake_的大小写,用于格式错误的python代码,python,regex,sed,Python,Regex,Sed,我有一些用camelCase编写的python代码,但是根据变量名,应该用snake\u的case编写。我编写了一个小的sed脚本,它成功地获取了任何小写字母\1,后跟一个大写字母\2,并将其转换为\1和小写字母\2 find . -iname \*.py | xargs sed -i "s/\([a-z]\)\([A-Z]\)/\1_\L\2/g" 然而,这将把CamelCase变成camelcou。根据同样的标准,类名应该用大写字母开头的CamelCase书写 如何编写一个不涉及Camel

我有一些用camelCase编写的python代码,但是根据变量名,应该用snake\u的case编写。我编写了一个小的sed脚本,它成功地获取了任何小写字母\1,后跟一个大写字母\2,并将其转换为\1和小写字母\2

find . -iname \*.py | xargs sed -i "s/\([a-z]\)\([A-Z]\)/\1_\L\2/g"
然而,这将把CamelCase变成camelcou。根据同样的标准,类名应该用大写字母开头的CamelCase书写

如何编写一个不涉及CamelCase但能翻译CAMELCAMEL的sed脚本。。。变成骆驼,骆驼,骆驼,骆驼

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

我正在使用GNU sed 4.2.2

尝试以下方法:

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

其中一条评论提到,这可能是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 }'
sed-r':循环;/.\*/{h;s/\1/;s/([A-Z])/\ul\1/g;g;s/(.*)\n(.*)\(.*)/\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
}
:循环
/.*\.*/ {
H
s/\1/
s/([A-Z])/\ul\1/g
G
s/(.*)\n(.*)\(.*)/\2\1\4/
b环
}
这里,
\
匹配一个dromedaryCase术语
\
是单词边界,以确保这仅与此类术语匹配。因此,在一个循环中:

  • 如果该行包含dromedaryCase术语:
  • 将整行保存到保持缓冲区
  • 分离单峰骆驼病例。这使用了
    /
    重用最后一个正则表达式的事实,即1中的正则表达式
  • 将所有大写字母替换为
    后接小写字母(这使用GNU扩展名
    \l
    ;否则需要
    y/ABCDEF…/ABCDEF…/
    命令来更改大小写)。模式空间现在包含与单峰驼案例术语对应的蛇案例
  • 将保留缓冲区中的原始行追加到模式空间
  • 在原始正则表达式的基础上,将模式空间拆分为相关部分:
    \1
    是snake\u case术语,
    \2
    是替换部分之前的原始行部分,
    \4
    是dromedaryCaseTerm之后的部分。然后按照正确的顺序重新组装这些零件
  • 循环,直到替换行中的所有dromedaryCase项

  • 如果你认为这不值得付出努力:不管你想做什么,已经有了一个py包,这难道不令人难过吗?@jornsharpe不清楚autopep8是否检测到了N*错误。你能引用一个文档或一些示例代码吗?更新:autopep8不会修复命名冲突。它使用pep8模块,该模块本身仅检测以下违规行为:。免责声明(页面顶部)特别声明不处理命名约定。对于我见过的最复杂的sed表达式,这是一个很好的解释。我甚至不知道在sed中循环是可能的。autopep8似乎是一条路要走,但我对sed和正则表达式的极限有点好奇。有证据表明sed是图灵完全的。不那么深奥的是,GNU sed可以调用任意shell命令,所以…是的,功能强大。但在某些时候,你需要考虑其他的选择,这一点在达到这个复杂程度之前就已经很好了。