regex Python:“拉出”整个组,但将其他所有内容保留在String中

时间:2018-09-19 23:11:24

标签: regex

假设我们可以采用以下形式输入字符串:

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)'

使用正则表达式怎么办?

我来的最远的是:

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

但这返回:

<_sre.SRE_Match object; span=(0, 14), match='Skank Up [feat'>

2 个答案:

答案 0 :(得分:1)

您可以使用feat删除以re.sub开头的括号,如

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

请参见regex demo

详细信息

  • \s*-超过0个空格
  • (?:\[feat[^][]+]|\(feat[^()]+\))-与两个选择匹配的非捕获组:
    • \[feat[^][]+]-[,然后是feat,然后是1个字符,除了][之外,还有]
    • |-或
    • \(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)

答案 1 :(得分:0)

我将使用单线sub命令解决此问题:

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

这样转换您的输入:

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

您也可以对其进行修改以接受不同类型的括号,例如([

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