【问题标题】:get rid of a specific part of an element in a set摆脱集合中元素的特定部分
【发布时间】:2018-07-27 20:05:54
【问题描述】:

我有一套

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) 不起作用

【问题讨论】:

  • 这似乎是一个非常简单的re.sub()。你有什么问题?
  • 替换为空字符串,替换"\g<1>\g<2>"""
  • 嗨@wiktor Stribizew,谢谢!我将编辑上面包含您的评论的问题
  • 不需要,我宁愿删除这个问题。您应该只使用regex101.com 来查看正则表达式的作用,并阅读有关re.subre 文档,尤其是反向引用。
  • 我的问题的主要焦点不是理解那条线,而是问题的一部分。

标签: python regex python-3.x


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    In [10]: {i.replace('[:AMide]', '').replace('[:dkja]', '') for i in set1}
    Out[10]: {'*klj?', 'DKJ?', 'JKLJS?', 'TRered?', 'abkjld:Sure:STe?', 'bl:VOLTe?'}
    

    毕竟,如果您想删除括号之间的所有内容,我认为您可以简单地使用否定字符类,如下所示:

    In [11]: import re
    
    In [12]: {re.sub(r'\[[^]]+\]', r'', i) for i in set1}
    Out[12]: {'*klj?', 'DKJ?', 'JKLJS?', 'TRered?', 'abkjld:Sure:STe?', 'bl:VOLTe?'}
    

    【讨论】:

    • 我认为他想摆脱任何[...],而不仅仅是那些特定的字符串。
    • @Barmar 好吧,这与这个问题无关。另外,我不知道是否在任何其他情况下提到了 OP。
    • 当他添加他尝试的代码时,这一点变得更加明显。
    • @Barmar 不,它不会因为看起来仍然像 XY 问题。
    • @Kasramvd 我打算将关闭原因更改为stackoverflow.com/questions/17373161/…,请作为骗子关闭。 Bob 用{} 初始化了一个字典,而不是一个集合。这是一个答案 - ideone.com/TDj4Er
    【解决方案3】:

    你可以试试这个:

    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?'}
    

    【讨论】:

      【解决方案4】:

      这是另一种选择

      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?'}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-14
        • 2021-09-01
        • 2023-04-05
        • 1970-01-01
        • 2020-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多