Как вы можете использовать re.sub для замены содержимого группы захвата на строку? - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь определить, как использовать re.sub для замены содержимого группы захвата, но, к сожалению, мой мозг слишком мал, чтобы понять документацию API для функции re.sub .

Пока мне удалось успешно изолировать строку, которую я хотел бы заменить, используя функцию re.search, но процесс использования API-функции re.sub должным образом ускользает от прошлых, настоящих и будущих возможностей моего смертельно и трагически ущербный мозг.

Я могу выбрать строку, которую хочу заменить, с помощью модуля re.search:

import re

RE_SELECT_CURSOR = re.compile(r'.*\(.*after:\s*(?:"*)([A-Za-z0-9\+\/\=]+)(?:"*)\s*\).*', flags=re.MULTILINE)

query = """
{{
    users(id: "{}") {{
        things(first: {}, after: null){{
            pageInfo {{
                startCursor endCursor hasNextPage
            }}
            edges {{
                node {{
                    id
                }}
            }}
        }}
    }}
}}
"""

#: Identifying the string that I would like to replace (i.e. the "cursor").
matches = re.search(RE_SELECT_CURSOR, query)
if matches:
    cursor = matches.group(1)
    print(cursor)

Однако, как только я пытаюсь заменить null на hello, моя наивность становится очевидной.

#: Trying to replace the "cursor".
result = re.sub(RE_SELECT_CURSOR, "hello", query)
print(result)

Это приводит к следующему:

{{
    users(id: "{}") {{
hello
            pageInfo {{
                startCursor endCursor hasNextPage
            }}
            edges {{
                node {{
                    id
                }}
            }}
        }}
    }}
}}

Я пробовал другие подходы, но ни один из них не сработал - правильное использование re.sub мучительно очевидно, но, просмотрев десятки примеров, у моего мозга просто не хватает вычислительной мощности, чтобы понять это .

Один из таких подходов заключался в следующем, но это смехотворно неверно, и я знаю, что мне должно быть стыдно за мою «попытку».

RE_REPLACE_GROUP = '.*\(.*after:\s*(?:"*)("hello")(?:"*)\s*\).*'
result = re.sub(RE_SELECT_CURSOR, RE_REPLACE_GROUP, query)

Другой подход заключался в следующем, но он также смешно некорректен.

import re

RE_SELECT_CURSOR = re.compile(r'.*\(.*after:\s*(?:"*)([A-Za-z0-9\+\/\=]+)(?:"*)\s*\).*', flags=re.MULTILINE)

query = """
{{
    organization(id: "{}") {{
        assets(first: {}, after: null){{
            pageInfo {{
                startCursor endCursor hasNextPage
            }}
            edges {{
                node {{
                    id
                }}
            }}
        }}
    }}
}}
"""

#: Identifying the string that I would like to replace (i.e. the "cursor").
matches = re.search(RE_SELECT_CURSOR, query)
if matches:
    cursor = matches.group(1)
    query = query.replace("after: {}".format(cursor), "after: {}".format("hello"))
    print(query)

Это привело к следующему:

{{
    organization(id: "{}") {{
        assets(first: {}, after: hello){{
            pageInfo {{
                startCursor endCursor hasNextPage
            }}
            edges {{
                node {{
                    id
                }}
            }}
        }}
    }}
}}

Результат технически правильный, но он не допустит пробелов в неправильном месте.

Как я могу заменить null на hello?

1 Ответ

0 голосов
/ 04 января 2019

При использовании group(1) вы извлекаете интересующую вас группу, но при использовании sub соответствие полностью заменяется заменой. А поскольку начало и конец выражения используются для соответствия контексту, при подстановке все совпадение заменяется на hello; не только интересующая вас группа.

Один из способов - создать 3 группы, и при совпадении заменить группы исходными группами \1 и \3 и изменить центральную группу на hello, например:

import re

RE_SELECT_CURSOR = re.compile(r'(\(.*after:\s*"*)([A-Za-z0-9\+\/\=]+)("*\s*\))')  # you don't need MULTILINE flag or leading/trailing .* patterns

query = """
{{
    users(id: "{}") {{
        things(first: {}, after: null){{
            pageInfo {{
                startCursor endCursor hasNextPage
            }}
            edges {{
                node {{
                    id
                }}
            }}
        }}
    }}
}}
"""


result = re.sub(RE_SELECT_CURSOR, r"\1hello\3", query)
print(result)

печать:

{{
    users(id: "{}") {{
        things(first: {}, after: hello){{
            pageInfo {{
                startCursor endCursor hasNextPage
            }}
            edges {{
                node {{
                    id
                }}
            }}
        }}
    }}
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...