Разделите UpperCamelCase и UPPERCamelCase для разделения слов - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь разбить строки UpperCamelCase и UPPERCamelCase на разные слова.У нас есть соглашение об именах, в котором сокращения пишутся в верхнем регистре, если в начале.

Например.SFTPServer

То, что я пытаюсь сделать, это разделить это на два слова SFTP и Server

Для UpperCamelCase мне удалось использовать следующий фрагмент кода

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

Выходы:

Sftp Server

Вопрос: Есть ли способ настроить это регулярное выражение так, чтобы я получал вывод для обоих случаев

т.SFTPServer и SftpServer?

Я также упомяну свой вариант использования, поскольку он может дополнительно дать некоторое представление об этом вопросе.Я пытаюсь преобразовать имена столбцов в метки в фляге и в 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 Ответ

1 голос
/ 05 апреля 2019

Нашим лучшим вариантом здесь, вероятно, является re.findall, потому что он позволяет использовать lookaheads, а 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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...