Строка регулярного выражения Python соответствует и заменяет одновременно - PullRequest
0 голосов
/ 14 октября 2019

Есть ли в Python способ поиска, возврата совпадающей строки и замены совпадающих строк одновременно? См. Пример ниже:

a = "[fox] dog turtle [cat]"

Цель:

result1 = "fox" #(first match inside bracket)
result2 = "cat" #(second match inside bracket)
result3 = "dog turtle" #(remaining string after removing matched text inside brackets

Что у меня есть:

result1, result2 = re.findall('\[.*?\]', a)
result3 = re.sub('\[.*?\]', '', a)

Это кажется излишним и неуклюжим иметьзапустить re дважды. Есть ли более элегантный способ добиться этого?

Ответы [ 2 ]

2 голосов
/ 14 октября 2019

Я думаю, что ваш код достаточно элегантен и удобочитаем, но если вы хотите усложнить ситуацию, не существует function, которые возвращают совпадений и заменяют их одновременно, ноВы можете использовать силу re.sub, которая принимает в repl аргумент function, который принимает совпадение в качестве аргумента и должен возвращать str замену, он используется для динамической замены (example: when the replacing depends on the value of the match it self).

import re

a = '[fox] dog turtle [cat]'
matches = []
# append method of list return None so the return string is always `''`
# so when ever we find a match to replace we add it to matches list and replace it with `''`
# in your result you return the fox without brackets so i'm using a capture group inside the brackets
text = re.sub('\[(.*?)\]', lambda m: matches.append(m.group(1)) or '', a)

print(matches)  # ['fox', 'cat']
print(text)  # dog turtle
0 голосов
/ 14 октября 2019

Вы можете использовать это регулярное выражение:

Регулярное выражение:

\[(.*?)\].*?(\w[\w\s]+\w).*?\[(.*?)\]

Regex

Код Python:

import re

a = '[fox] dog turtle [cat]'
pattern = r'\[(.*?)\].*?(\w[\w\s]+\w).*?\[(.*?)\]'
res = re.search(pattern,a)
r1,r2,r3 = res.groups()

Демонстрация: Здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...