我试图从字符串中删除一些文本。我想要删除的可能是下面列出的任何一个例子。基本上是大写和小写的任意组合,末尾是整数的任意组合,末尾是字母的任意组合。也可以有空格,也可以没有。
- (磁盘1)
- (磁盘5)
- (Disc2)
- (磁盘10)
- (部分)
- (Pt B)
- (磁盘)
- (CD 7)
- (cD X)
我已经有一个方法来获取开头"(type">
)multi_disk_search = [ '(disk', '(disc', '(part', '(pt', '(prt' ]
if any(mds in fileName.lower() for mds in multi_disk_search): #https://stackoverflow.com/a/3389611
for mds in multi_disk_search:
if mds in fileName.lower():
print(mds)
break
返回(disc
。
不能只用圆括号分开,因为其他圆括号中可能有其他标签。也没有特定的顺序标签。我要找的人通常是最后一个;然而很多时候它不是。
我认为解决方案将需要正则表达式,但我真的迷路了,当它涉及到。
我试过了,但是它返回的东西对我来说没有任何意义。
regex = re.compile(r"s*%ss*" % (mds), flags=re.I) #https://stackoverflow.com/a/20782251/11214013
regex.split(fileName)
newName = regex
print(newName)
返回re.compile('\s*\(disc\s*', re.IGNORECASE)
有哪些方法可以解决这个问题?
可能是这样的:
rx = re.compile(r'''
(
(?: dis[ck] | p(?:a?r)?t )
[ ]?
(?: [a-z]+ | [0-9]+ )
)''', re.I | re.X)
此模式只使用regex模式的基本语法,除了X标志,Verbose模式(使用此模式时,模式中的任何空白字符都会被忽略,除非它被转义或在字符类中)。请随意阅读有关re模块的python手册。添加对CD的支持作为练习。
>>> import re
>>> def remove_parens(s,multi_disk_search):
... mds = '|'.join([re.escape(x) for x in multi_disk_search])
... return re.sub(f'((?:{mds})[0-9A-Za-z ]*)','',s,0,re.I)
...
>>> multi_disk_search = ['disk','cd','disc','part','pt']
>>> remove_parens('this is a (disc a) string with (123xyz) parens removed',multi_disk_search)
'this is a string with (123xyz) parens removed'