【问题标题】:How to replace uppercase with underscore?如何用下划线替换大写?
【发布时间】:2011-09-06 15:03:48
【问题描述】:

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

ThisIsAGoodExample

应该变成

this_is_a_good_example

关于如何实现这一点的任何想法/提示/链接/教程?

【问题讨论】:

  • 您给出的示例既不匹配该问题的标题也不匹配该问题的描述。您是要尝试用下划线替换所有大写字符,还是要尝试将 CamelCase 转换为 lowercase_underscore_separated?你会发现,除非你能用语言解释你想要做什么,否则用 Python(或任何其他语言)解决它将太具有挑战性了。

标签: python regex string replace uppercase


【解决方案1】:

这是一个正则表达式方式:

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

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

【讨论】:

  • 漏掉了很多大写字母。例如,它不能处理我名字的一个拼写,“Éric”。 IIRC,\p{Lu} 是合适的模式,而不是 [A-Z]
【解决方案2】:
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()

【讨论】:

  • 对新手放心。 :)
  • 这是最好的答案!
【解决方案3】:

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

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

顺便说一句,您还没有指定如何处理字符串中已经存在的下划线。我不知道如何处理这种情况,所以我下注了。

【讨论】:

    【解决方案4】:

    由于没有其他人提供使用生成器的解决方案,这里有一个:

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

      【讨论】:

      • 将第 6 行替换为 if character.isupper(),它也(应该)处理 unicode。
      • 将第 3 行替换为 new_example = example[0].lower()
      【解决方案6】:

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

      【讨论】:

      • 第一个大写字符呢?
      • @rplnt - 由于他的措辞与他的例子不符,所以我选择了措辞
      • @KevinDTimm:嗯,他写了“in a word”,我读作“in the middle of a word”。
      • 他也没有说要转换为小写 - 他的措辞确实应该将 ThisIsAGoodExample 转换为 _his_s__ood_xample
      【解决方案7】:

      一个可读版本的尝试:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-12
        相关资源
        最近更新 更多