代码之家  ›  专栏  ›  技术社区  ›  zerohedge

正则表达式Python:“拉出”整个组,但保留所有其他字符串

  •  1
  • zerohedge  · 技术社区  · 7 年前

    假设传入字符串的形式如下:

    st = 'Skank Up [feat. Ding Dong] (Oh Lawd)'
    st2 = 'Skank Up (Oh Lawd) [feat. Ding Dong]'
    st3 = 'Skank Up (Oh Lawd) (feat. Ding Dong)'
    

    在这三种情况下,我想最后得到:

    'Skank Up (Oh Lawd)'
    

    如何使用regex实现这一点?

    st = re.match('.*(?:\(feat|\[feat)', st)
    

    但结果是:

    <_sre.SRE_Match object; span=(0, 14), match='Skank Up [feat'>
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Wiktor Stribiżew    7 年前

    feat 使用 re.sub 喜欢

    re.sub(r'\s*(?:\[feat[^][]+]|\(feat[^()]+\))', '', st)
    

    看到了吗 regex demo

    细节

    • \s* -0+空格
    • (?:\[feat[^][]+]|\(feat[^()]+\))
      • \[feat[^][]+] - [ ,那么 ,则1+个字符 ] [ 然后 ]
      • | -或者
      • \(feat[^()]+\) - ( ,那么 壮举 ( ) ) .

    你也可以使用一个轻微的变化,如果没有什么,但 壮举 内括号:

    re.sub(r'\s*(?:\[feat[^]]*]|\(feat[^)]*\))', '', st)
    

    Python demo

    import re
    sts = ['Skank Up [feat. Ding Dong] (Oh Lawd)','Skank Up (Oh Lawd) [feat. Ding Dong]', 'Skank Up (Oh Lawd) (feat. Ding Dong)']
    for st in sts:
        print(re.sub(r'\s*(?:\[feat[^][]+]|\(feat[^()]+\))', '', st))
    

    Skank Up (Oh Lawd)
    Skank Up (Oh Lawd)
    Skank Up (Oh Lawd)
    
        2
  •  0
  •   Addison    7 年前

    我会用一条线来解决这个问题 sub

    re.sub(r" \[feat[^\]]*\]", "", st)
    

    Skank Up [feat. Ding Dong] (Oh Lawd)  
    Skank Up (Oh Lawd)
    

    您也可以修改它以接受不同类型的方括号,例如 ( [

    re.sub(r" [\[\(]feat[^\])]*[)\]]", "", st)