用 Python re 替换为自定义函数
Replace with a custom function with Python re
对于字符串
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
那样简单地替换,而是有一个自定义替换功能,但我在文档中找不到这个了(也许我我在搜索错误的关键字...)
这没有给出任何输出:
import re
r = re.match('{{.*?}}', '{{a,b}} and {{c,d}} and {{0,2}}')
for m in r.groups():
print(m)
你可以使用
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)
您可以使用适当的正则表达式来避免拆分以获取模式:
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
对于字符串
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
那样简单地替换,而是有一个自定义替换功能,但我在文档中找不到这个了(也许我我在搜索错误的关键字...)
这没有给出任何输出:
import re
r = re.match('{{.*?}}', '{{a,b}} and {{c,d}} and {{0,2}}')
for m in r.groups():
print(m)
你可以使用
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)
您可以使用适当的正则表达式来避免拆分以获取模式:
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