我想做一些特别的re.sub 输入
string = "\"hope\" and \"love\" or \"passion\" and (\"luck\" or \"money\") "
word_list = ['hope', 'love', 'passion', 'money', 'luck']
希望的输出是
'0 and 1 or 2 and (4 or 3)
我尝试
print(re.sub("\"([^\"]*)\"", stri.index(r'\g<1>') , string))
但它不起作用
答案 0 :(得分:1)
将re.sub
函数与 replacement 函数一起用作第二个参数:
string = "\"hope\" and \"love\" or \"passion\" and (\"luck\" or \"money\") "
word_list = ['hope', 'love', 'passion', 'money', 'luck']
print(re.sub("\"([^\"]*)\"", lambda m:
str(word_list.index(m.group(1))) if m.group(1) in word_list else m.group(1), string))
输出:
0 and 1 or 2 and (4 or 3)
(请注意,可能存在不在word_list
列表中的匹配项,例如... (\"luck\" or \"money\") or \"compassion\"
)
re.sub (pattern,repl,string,count = 0,flags = 0)
... 如果repl是一个函数,则为每个非重叠调用它 发生模式。该函数采用单个匹配对象 参数,并返回替换字符串。
答案 1 :(得分:0)
在不考虑单词列表的情况下,您可以使用itertools.count
来计算匹配数,将函数作为sub()
函数的第二个参数来调用next
每场比赛的计数器。
In [10]: from itertools import count
In [11]: c = count()
In [12]: re.sub(r'"([^"]+)"', lambda x: str(next(c)), string)
Out[12]: '0 and 1 or 2 and (3 or 4) '
如果您希望索引基于word_list
中的单词索引作为一种有效的方法,您可以创建一个字典,从单词作为键,索引作为值,然后使用简单的索引获取sub()
函数中的相应索引:
In [29]: word_dict = {w: str(i) for i, w in enumerate(word_list)}
In [30]: re.sub(r'"([^"]+)"', lambda x: word_dict[x.group(1)], string)
Out[30]: '0 and 1 or 2 and (4 or 3) '
请注意,您可以使用list.index
方法访问每个单词的单词索引。但是由于列表索引的复杂性是O(n),它不如使用O(1)的字典索引那样有效。
答案 2 :(得分:0)
或者(没有re
),您可以使用enumerate
对word_list
进行迭代,并使用string
替换str.replace()
的内容为:
my_string = "\"hope\" and \"love\" or \"passion\" and (\"luck\" or \"money\") "
word_list = ['hope', 'love', 'passion', 'money', 'luck']
for i, word in enumerate(word_list):
my_string = my_string.replace('"{}"'.format(word), str(i))
my_string
保留的最终值为:
'0 and 1 or 2 and (4 or 3) '