Заменить пользовательской функцией на Python re - PullRequest
2 голосов
/ 07 апреля 2020

Для строки

s = '{{a,b}} and {{c,d}} and {{0,2}}'

Я хотел бы заменить каждый шаблон {{...}} случайным образом одним из элементов в списке внутри, то есть:

"a and d and 2"  
"b and d and 0"  
"b and c and 0"
...

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

Это не дает никакого вывода:

import re

r = re.match('{{.*?}}', '{{a,b}} and {{c,d}} and {{0,2}}')
for m in r.groups():
    print(m)

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

Вы можете избежать разделения, используя соответствующее регулярное выражение для извлечения паттернов:

import re, random

s = '{{a,b}} and {{c,d}} and {{0,2}}'
s = re.sub(r'{{(.*?),(.*?)}}', random.choice(['\\1', '\\2']), s)

# a and c and 0
2 голосов
/ 07 апреля 2020

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

import random, re

def replace(match):
    lst = match.group(1).split(",")
    return random.choice(lst)

s = '{{a,b}} and {{c,d}} and {{0,2}}'

s = re.sub(r"{{([^{}]+)}}", replace, s)
print(s)

Или - если вы в однострочнике (не рекомендуется):

s = re.sub(
    r"{{([^{}]+)}}", 
    lambda x: random.choice(x.group(1).split(",")), 
    s)
...