Я пытаюсь определить, как использовать 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
?