拆分UpperCamelCase和UPPERCamelCase以分隔单词

时间:2019-04-05 09:56:55

标签: python regex

我想做的是将UpperCamelCase和UPPERCamelCase字符串拆分为不同的单词。我们有一个命名约定,如果在开头则用大写字母写缩写。

例如。 SFTPServer

我要完成的工作是将其分为两个词SFTPServer

对于UpperCamelCase,我可以使用以下代码

r="SftpServer"
print(' '.join(re.findall('^[a-z]+|[A-Z][^A-Z]*', r)))

输出:

Sftp Server

问题:有什么方法可以调整此正则表达式,以便在两种情况下都能得到输出

即。 SFTPServerSftpServer

我还将提及我的用例,因为它可能进一步提供对该问题的一些见解。 我正在尝试将列名转换为flask和SQL Server中的标签。

def get_label_names():
        cursor=CONN.cursor()
        db_name=CONFIG['DB']['DATABASE']['NAME']
        cursor.execute('use '+db_name)
        cursor.execute(f"""\
        SELECT COLUMN_NAME
        FROM {db_name}.INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = N'Client'
        """
        )
        col_info=[item[0] for item in cursor.fetchall()]
        labels=[' '.join(re.findall('^[a-z]+|[A-Z][^A-Z]*', r)) for r in col_info]
        return labels

1 个答案:

答案 0 :(得分:1)

我们这里最好的选择可能是re.findall,因为它允许使用先行,而re.split不允许。我们可以尝试分裂 遵循以下模式:

[A-Z]{2,}(?=[A-Z][a-z])|[A-Z][a-z]+|[A-Z]+$

此模式表示要匹配:

[A-Z]{2,}(?=[A-Z][a-z])

两个或更多大写字母,直到到达大写字母,然后是小写字母(表示下一个驼峰单词的开头)。

[A-Z][a-z]+

一个驼峰词,大写字母后跟一个或多个小写字母。

[A-Z]+$

任何连续的末尾大写字母。

代码:

input = "SFTPServerABC"
results = re.findall(r'[A-Z]{2,}(?=[A-Z][a-z])|[A-Z][a-z]+|[A-Z]+$', input)
print(results)

['SFTP', 'Server', 'ABC']