Python: считать и заменять регулярное выражение в одном проходе? - PullRequest
3 голосов
/ 28 марта 2020

Я могу глобально заменить регулярное выражение на re.sub(), и я могу посчитать совпадения с

for match in re.finditer(): count++

Есть ли способ объединить эти два, чтобы я мог считать свои замены, не делая два прохода через исходную строку?

Примечание. Меня не интересует, соответствует ли подстановка, меня интересует точное количество совпадений в одном вызове, избегая одного вызова для подсчета и одного вызова для замены.

Ответы [ 3 ]

2 голосов
/ 28 марта 2020

Вы можете использовать re.subn.

re.subn(pattern, repl, string, count=0, flags=0)

, возвращается (new_string, number_of_subs_made)

В качестве примера я использую тот же пример, что и @Shubham Шарма используется.

text = "Jack 10, Lana 11, Tom 12, Arthur, Mark"
out_str,count=re.subn(r"(\d+)", repl='replacement', string=text)

#out_str-->'Jack replacement, Lana replacement, Tom replacement, Arthur, Mark'
#count---> 3
2 голосов
/ 28 марта 2020

Вы можете передать функцию repl при вызове функции re.sub. Функция принимает один аргумент объекта сопоставления и возвращает строку замены. Функция repl вызывается для каждого неперекрывающегося вхождения шаблона.

Попробуйте это:

count = 0
def count_repl(mobj): # --> mobj is of type re.Match
    global count
    count += 1 # --> count the substitutions
    return "your_replacement_string" # --> return the replacement string

text = "The original text" # --> source string
new_text = re.sub(r"pattern", repl=count_repl, string=text) # count and replace the matching occurrences in one pass.

ИЛИ,

Вы можете использовать re.subn , который выполняет ту же операцию, что и re.sub , но возвращает кортеж (new_string, number_of_subs_made).

new_text, count = re.sub(r"pattern", repl="replacement", string=text)

Пример:

count = 0
def count_repl(mobj):
    global count
    count += 1
    return f"ID: {mobj.group(1)}"

text = "Jack 10, Lana 11, Tom 12, Arthur, Mark"
new_text = re.sub(r"(\d+)", repl=count_repl, string=text)

print(new_text)
print("Number of substitutions:", count)

Выход:

Jack ID: 10, Lana ID: 11, Tom ID: 12
Number of substitutions: 3
0 голосов
/ 28 марта 2020
import re


text = "Jack 10, Lana 11, Tom 12"
count = len([x for x in re.finditer(r"(\d+)", text)])
print(count)

# Output: 3

Хорошо, есть лучший способ

import re


text = "Jack 10, Lana 11, Tom 12"
count = re.subn(r"(\d+)", repl="replacement", string=text)[1]
print(count)

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