假设我们可以采用以下形式输入字符串:
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'>
答案 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)
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)