Нижний регистр на основе шаблона regex в Django & Python

Сценарий, который я использую, вызывает метод s_lower для преобразования всего текста в строчные буквы, но есть одна загвоздка: если это ссылка (есть специальный regex), то он не переводит ее в строчные буквы. Поэтому я хотел бы применить ту же или подобную логику с другими regex.

RE_WEBURL_NC = (
    r"(?:(?:(?:(?:https?):)\/\/)(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1["
    r"6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?"
    r":[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9][a-z0-9_-]{0,62})?[a-z0-9]\.)+(?:[a-z]{2,}\.?))(?::\d{2,5})?)(?:"
    r"(?:[/?#](?:(?![\s\"<>{}|\\^~\[\]`])(?!&lt;|&gt;|&quot;|&#x27;).)*))?"
)

def s_lower(value):
    url_nc = re.compile(f"({RE_WEBURL_NC})")

    # Do not lowercase links
    if url_nc.search(value):
        substrings = url_nc.split(value)
        for idx, substr in enumerate(substrings):
            if not url_nc.match(substr):
                substrings[idx] = i18n_lower(substr)
        return "".join(substrings)

    return i18n_lower(value)

Я хочу, чтобы весь текст, кроме текста внутри специальных тегов, был в нижнем регистре.

def s_lower(value):
    spec_nc = re.compile(r"\[spec .*\]") # this is for [spec some raNdoM cAsE text here]

    if spec_nc.search(value):
        substrings = spec_nc.split(value)
        for idx, substr in enumerate(substrings):
            if not spec_nc.match(substr):
                substrings[idx] = i18n_lower(substr)
        return "".join(substrings)

    return i18n_lower(value)

Я писал это как комментарий, но он получился слишком длинным...

Вы не сказали, в чем проблема, но похоже, что вам не хватает () вокруг regex (так что разделенная строка заканчивается substrings). Должно быть

spec_nc = re.compile(r"(\[spec .*\])")

Примечание:

<

Таким образом, вы можете упростить свой код до:

def s_lower(value):
    spec_nc = re.compile(r"(\[spec [^]]*\])") # this is for [spec some raNdoM cAsE text here]
    
    substrings = spec_nc.split(value)
    for idx, substr in enumerate(substrings):
        if idx % 2 == 0:
            substrings[idx] = i18n_lower(substr)
    return "".join(substrings)
Вернуться на верх