2

对于一个字符串

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不仅可以简单地替换 like re.sub,而且具有自定义替换功能,但是我在文档中找不到这个了(也许我正在搜索错误的关键字......)

这不会给出任何输出:

import re

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

2 回答 2

2

你可以使用

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)
于 2020-04-07T14:47:59.963 回答
2

您可以避免使用适当的正则表达式来获取模式进行拆分:

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
于 2020-04-07T14:52:09.670 回答