1

Python で CamelCase 文字列から詳細な名前を取得しようとしていますが、問題に対処する方法がわかりません。

これはユースケースです:

class MyClass(object):
    def verbose_name(self, camelcase):
        return "my class"
        # ^-- here I need a way to calculate the
        #     value using the camelcase argument

    def __str__(self):
        return self.verbose_name(self.__class__.__name__)

小文字から大文字への遷移を検出してチャンクが生成されるソリューションを実装しようとしましたが、非常に手続き的で機能せず、そのような単純なタスクには複雑になりすぎていmyます。class

問題を解決するための簡単な実装に関する提案はありますか?

4

3 に答える 3

4

私があなたの要件を正しく理解していれば、Case 境界でキャメル ケース文字列を分割する必要があります。ここでは正規表現が非常に便利です

次の実装を試してください

>>> ' '.join(re.findall("([A-Z][^A-Z]*)","MyClass")).strip()
'My Class'

名前がキャメルケースに準拠していない場合、上記の実装は失敗します。そのような場合は、capsオプションにします

>>> test_case = ["MyClass","My","myclass","my_class","My_Class","myClass"]
>>> [' '.join(re.findall("([A-Z]?[^A-Z]*)",e)) for e in test_case]
['My Class ', 'My ', 'myclass ', 'my_class ', 'My_ Class ', 'my Class ']
于 2013-01-17T15:56:14.140 に答える
2

Abhijitの答えに基づいて構築する

def verbose_name(self, camelcase):
    return '_'.join(re.findall("([A-Z][^A-Z]*)", camelcase)).lower()
于 2013-01-17T15:58:21.187 に答える
0

これはどう:

def verbose_name(self, camelcase)
    return re.sub(r'([a-z])([A-Z])',r'\1 \2', camelcase).lower()
于 2013-01-17T15:57:57.057 に答える