我是Python新手,我正在尝试将单词中的所有大写字母替换为下划线,例如:
ThisIsAGoodExample
应该变成
this_is_a_good_example
关于如何实现这一目标有任何想法/提示/链接/教程吗?
这是正则表达式的方式:
import re
example = "ThisIsAGoodExample"
print re.sub( '(?<!^)(?=[A-Z])', '_', example ).lower()
这就是说,“在字符串中查找 aren't 前面是行首,并且 are 后跟大写字符的点,并替换下划线。然后我们将整个内容小写()。
import re
"_".join(l.lower() for l in re.findall('[A-Z][^A-Z]*', 'ThisIsAGoodExample'))
编辑: 实际上,只有当第一个字母是大写时,这才有效。否则,这(取自here)会做正确的事情:
def convert(name):
s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower()
这会生成一个项目列表,其中每个项目都是“_”,如果该字符最初是大写字母,则后跟小写字母,如果不是,则为字符本身。然后它将它们连接在一起形成一个字符串,并删除该过程可能添加的任何前导下划线:
print ''.join('_' + char.lower() if char.isupper() else char
for char in inputstring).lstrip('_')
顺便说一句,您还没有指定如何处理字符串中已经存在的下划线。我不确定如何处理这种情况,所以我下注了。
由于没有其他人提供使用生成器的解决方案,这里有一个:
>>> sample = "ThisIsAGoodExample"
>>> def upperSplit(data):
... buff = ''
... for item in data:
... if item.isupper():
... if buff:
... yield buff
... buff = ''
... buff += item
... yield buff
...
>>> list(upperSplit(sample))
['This', 'Is', 'A', 'Good', 'Example']
>>> "_".join(upperSplit(sample)).lower()
'this_is_a_good_example'
example = 'ThisIsAGoodExample'
# Don't put an underscore before first character.
new_example = example[0].lower()
for character in example[1:]:
# Append an underscore if the character is uppercase.
if character.isupper():
new_example += '_'
new_example += character.lower()
解析你的字符串,每次遇到大写字母时,在它前面插入一个_,然后将找到的字符切换为小写
尝试可读版本:
import re
_uppercase_part = re.compile('[A-Z][^A-Z]*')
def uppercase_to_underscore(name):
result = ''
for match in _uppercase_part.finditer(name):
if match.span()[0] > 0:
result += '_'
result += match.group().lower()
return result
我不知道,但我在这里看到的大多数答案都相当复杂;我希望我的解决方案有效 -
使用简单的 for 循环打印出相关字符串的字符,从而在布局时测试每个字符,我们有;
ourCamelcase = input("somecamelCase: ")
print("thesnake_case: ", end="")
for char in ourcamelCase:
if c.isupper():
print("_" + char.lower(), end="")
else:
print(char, end="")
print("")