Regex, чтобы вставить символ перед словом все заглавные - PullRequest
1 голос
/ 25 февраля 2020

Пытаясь создать Regex для достижения этой строковой конвертации:

GetMQ -> Get_MQ
AllJSON -> All_JSON
JSONOBJ -> JSONOBJ
ServiceHTTP_Secure_Shell -> Service_HTTP_Secure_Shell

В python, я попробовал это:

regex = re.compile(r"(?<!\A)(?=([A-Z]{2,}))")  # Not at the beginning, Lookahead ALLCAPS
result = regex.sub('_', given_string)

, но безуспешно, я получил это:

Get_MQ
All_J_S_ON
J_A_S_O_N_O_BJ
Service_H_T_TP_Secure_Shell
1009 * Кажется, 2 или более заглавных букв выражения затрачивая несколько раз. Как я могу это исправить? Благодаря.

Ответы [ 2 ]

3 голосов
/ 25 февраля 2020

Вы можете использовать это

(?!^)(?<=[^A-Z_])([A-Z]+)
  • (?!^) - Отрицательное предпросмотр не должно совпадать с началом строки
  • (?<=[^A-Z_]) - Позитивному совпадению с задним числом должно предшествовать что угодно, кроме прописные алфавиты или _
  • ([A-Z]+) - сопоставить прописные алфавиты один или несколько раз

заменить на

_\1

Regex Demo

2 голосов
/ 25 февраля 2020

Попробуйте:

sub = re.sub(r"([A-Z]{1}[a-z]+)([A-Z_a-z]+)", r"\1_\2", string)
print(sub)

Вывод:

  • , когда string равно GetMQ >>> Get_MQ
  • , когда string равно AllJSON >>> All_JSON
  • , когда string равно JSONOBJ >>> JSONOBJ
  • , когда string равно ServiceHTTP_Secure_Shell >>> Service_HTTP_Secure_Shell
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...