特别re.sub python3

时间:2016-12-01 20:29:03

标签: python regex python-3.x

我想做一些特别的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))

但它不起作用

3 个答案:

答案 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),您可以使用enumerateword_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) '