摆脱集合中元素的特定部分

时间:2018-02-16 21:03:33

标签: python regex python-3.x

我有套装

set1={'*klj?', 'bl:VOLTe?', 'abkjld:Sure:STe?', 'JKLJS?', 'TRered[:AMide]?', 'DKJ[:dkja]?'}

我希望套装看起来像

set1={'*klj?', 'bl:VOLTe?', 'abkjld:Sure:STe?', 'JKLJS?', 'TRered?','DKJ?'}

我想摆脱集合中的[:AMide][:dkja]

我正在尝试使用正则表达式

到目前为止我所拥有的是

set2={}
    for element in set:
        x=re.sub("([\(\[]).*?([\)\]])", "", str(element))
        set2.add(x)

这摆脱了[]和内部的东西,但没有正确地重新创建集合,即set2.add(x)不起作用

4 个答案:

答案 0 :(得分:1)

此任务不需要这么复杂的正则表达式。只需使用集合理解的两个替换:

List Box

毕竟,如果你想删除括号之间的所有东西,我想你可以简单地使用一个否定的字符类如下:

DoCmd.GoToRecord , , acNewRec
DoCmd.RunCommand acCmdSaveRecord
Me.MyList.Requery

答案 1 :(得分:1)

字符串是不可变的。您无法就地替换字符串。修改集合的正确方法是删除有问题的元素并输入正确的版本,或者创建一个全新的集合。后一种方法是单行的:

set1 = set(re.sub("([\(\[]).*?([\)\]])", "\g<1>\g<2>", str(element)) for element in set1)

答案 2 :(得分:0)

你可以试试这个:

import re
set1={'*klj?', 'bl:VOLTe?', 'abkjld:Sure:STe?', 'JKLJS?', 'TRered[:AMide]?', 'DKJ[:dkja]?'}
new_set = {re.sub('\[\:[a-zA-Z]+\]', '', i) for i in set1}

输出:

{'*klj?', 'abkjld:Sure:STe?', 'DKJ?', 'JKLJS?', 'TRered?', 'bl:VOLTe?'}

答案 3 :(得分:0)

这是另一种选择

res = {re.sub('(:AMide)|(:dkja)', '', s) for s in set1}
{re.sub(']|\[', '', t) for t in res}

输出为:

>>>>  {'*klj?', 'DKJ?', 'JKLJS?', 'TRered?', 'abkjld:Sure:STe?', 'bl:VOLTe?'}