Заменить второй и последний второй символы, используя re.sub - PullRequest
0 голосов
/ 14 мая 2019

У меня есть строка "F(foo)", и я хотел бы заменить эту строку на "F('foo')".Я знаю, что мы также можем использовать регулярное выражение во втором параметре и выполнить эту замену, используя re.sub(r"F\(foo\)", r"F\('foo'\)",str).Но проблема здесь в том, что foo является динамической строковой переменной.Это отличается каждый раз, когда мы хотим сделать эту замену.Возможно ли с помощью какого-то регулярного выражения сделать такую ​​замену более чистым способом?

Я помню один способ извлечь foo, используя (), а затем .group(1).Но для этого нужно определить еще одну временную переменную просто для хранения foo.Мне любопытно, есть ли способ, которым мы можем заменить "F(foo)" на "F('foo')" в одной строке или другими словами более понятным способом.

Примеры:

F(name) следует заменить на F('name').F(id) следует заменить на F('id').G (имя) не должно быть заменено.Таким образом, регулярное выражение будет r"F\((\w)+\)", чтобы найти такие строки.

Ответы [ 4 ]

2 голосов
/ 14 мая 2019

Использование re.sub

Пример:

import re

s = "F(foo)"
print(re.sub(r"\((.*)\)", r"('\1')", s))

Выход:

F('foo')
0 голосов
/ 14 мая 2019

В вашем паттерне F\((\w)+\) вы почти на месте, вам просто нужно поставить квантификатор + после \w, чтобы повторить соответствующие 1+ слова слова.

Если вы поместите его после захватаgroup, вы повторяете группу, которая даст вам значение последней итерации в группе захвата, которая будет второй o в foo.

Вы можете обновить свое выражение до:

F\((\w+)\)

А при замене обращайтесь к группе захвата, используя \1

F('\1')

Например:

import re
str = "F(foo)"
print(re.sub(r"F\((\w+)\)", r"F('\1')", str)) # F('foo')

Python demo

0 голосов
/ 14 мая 2019

Есть несколько способов, в зависимости от того, что на самом деле является foo.Если он не может содержать ( или ), вы можете просто заменить ( на (' и ) на ').В противном случае попробуйте использовать

re.sub(r"F\((.*)\)", r"F('\1')", yourstring)

, где \1 в заменяющей части будет ссылаться на группу захвата (.*) в регулярном выражении поиска

0 голосов
/ 14 мая 2019

Следующее регулярное выражение содержит допустимые идентификаторы [Python | C | Java] после F и в скобках в одинарных кавычках:

re.sub(r"F\(([_a-z][_a-z0-9]+)\)", r"F('\1')", s, flags=re.I)
#"F('foo')"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...