我想做的是将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

最佳答案

我们最好的选择可能是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']

10-08 09:28