我想做的是将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
答案 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']