如何用下划线替换大写?

时间:2011-09-06 15:03:48

标签: python regex string replace uppercase

我是Python的新手,我试图将单词中的所有大写字母替换为下划线,例如:

ThisIsAGoodExample

应该成为

this_is_a_good_example

有关如何实现这一目标的任何想法/提示/链接/教程?

7 个答案:

答案 0 :(得分:10)

这是一种正则表达方式:

import re
example = "ThisIsAGoodExample"
print re.sub( '(?<!^)(?=[A-Z])', '_', example ).lower()

这就是说,“在不是的字符串中查找以行首开头的点, 后跟一个大写字符,并替换下划线然后我们降低()整个事情。

答案 1 :(得分:8)

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()

答案 2 :(得分:5)

这将生成一个项目列表,其中每个项目为“_”,如果字符最初为大写字母,则后跟小写字母,如果不是,则为字符本身。然后它将它们连接成一个字符串,并删除该进程可能添加的任何前导下划线:

print ''.join('_' + char.lower() if char.isupper() else char
              for char in inputstring).lstrip('_')

顺便说一句,您尚未指定如何处理字符串中已存在的下划线。我不知道如何处理这个案子,所以我发了嘘。

答案 3 :(得分:2)

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()

答案 4 :(得分:1)

由于没有其他人使用发电机提供解决方案,所以这里有一个:

>>> 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'

答案 5 :(得分:0)

解析你的字符串,每次遇到大写字母时,在它之前插入_然后将找到的字符切换为小写

答案 6 :(得分:0)

尝试使用可读版本:

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