我想做的是将UpperCamelCase和UPPERCamelCase字符串拆分为不同的单词。我们有一个命名约定,其中的缩写以大写开头。
例如。 SFTPServer
我要完成的工作是将其分为两个词SFTP
和Server
对于UpperCamelCase,我可以使用以下代码
r="SftpServer"
print(' '.join(re.findall('^[a-z]+|[A-Z][^A-Z]*', r)))
输出:
Sftp Server
问题:有什么方法可以调整此正则表达式,以便在两种情况下都可以输出
即。
SFTPServer
和SftpServer
?我还将提到我的用例,因为它可能进一步提供对该问题的一些见解。
我正在尝试将列名称转换为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']