【问题标题】:Extract letters (and a specific number) from a string从字符串中提取字母(和特定数字)
【发布时间】:2021-12-10 14:58:30
【问题描述】:

我有一个类似于下面的字符串列表:

l = ['ad2g3f234','4jafg32','fg23g523']

对于l 中的每个字符串,我想删除每个数字(2 和3 除外,如果它们显示为23)。所以在这种情况下,我想要以下结果:

n = ['adgf23','jafg','fg23g23']

我该怎么做?我试过re.findall 喜欢:

w = [re.findall(r'[a-zA-Z]+',t) for t in l]

但它并没有给出我想要的结果。

【问题讨论】:

    标签: python regex string


    【解决方案1】:

    您可以在一个组中捕获 23 个,并删除所有其他数字。在替换中,如果存在 23 则使用包含 23 的组,否则替换为空字符串。

    import re
    
    l = ['ad2g3f234', '4jafg32', 'fg23g523']
    
    result = [
        re.sub(
            r"(23)|(?:(?!23)\d)+", 
            lambda m: m.group(1) if m.group(1) else "", s) for s in l
    ]
    print(result)
    

    输出

    ['adgf23', 'jafg', 'fg23g23']
    

    Python demo

    【讨论】:

    • 你能解释一下 lambda 函数在做什么吗?谢谢
    • @NewbieAF lambda 是 re.sub 的回调函数 请参阅 docs.python.org/3/library/re.html#re.sub 这个代码示例在哪里 m 是“matchobj”
    • 该函数检查匹配对象是否有一个包含值 23 的捕获组 1。如果存在捕获组 1,则放回 23。如果不存在组 1,则匹配包含除 23 之外的所有其他数字。然后该匹配被替换为空字符串。
    • 如何排除更多字符?例如,如果我想排除“-”、“+”、“{}”和“()”以及任何不构成“23”的数字?
    • @NewbieAF 模式与- 或+ 不匹配,因此它们将保留在字符串中。
    【解决方案2】:

    一种方法是将字符串替换两次:

    [re.sub("\d", "", i.replace("23", "*")).replace("*", "23") for i in l]
    

    输出:

    ['adgf23', 'jafg', 'fg23g23']
    

    【讨论】:

      【解决方案3】:

      在re.sub 中使用占位符

      l = ['ad2g3f234','4jafg32','fg23g523']
      w = [re.sub('#','23',re.sub('\d','',re.sub('23','#',t))) for t in l]
      
      ['adgf23', 'jafg', 'fg23g23'] 
      

      编辑

      正如 Chris 所回答的,虽然 字符串替换会是更好的选择 stack_comparison

      ,但方法是相同的

      【讨论】:

        【解决方案4】:

        将 re.sub 与函数一起使用

        重新导入

        def replace(m):
            if m.group() == '23':
                return m.group()
            else:
                return ''
            
        l = ['ad2g3f234','4jafg32','fg23g523']
        w = [re.sub(r'23|\d', replace, x) for x in l]
        
        #w: ['adgf23', 'jafg', 'fg23g23']
        

        说明

        re.sub(r'23|\d', replace, x)
        - checks first for 23, next for a digit
        - replace function leaves alone match with 23
        - changes match with digit to null string.
        

        【讨论】:

          猜你喜欢
          • 2017-07-30
          • 2020-10-30
          • 2013-06-29
          • 2016-04-20
          • 2010-10-18
          • 1970-01-01
          • 2015-06-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多