如何用正则expression式删除括号内的文本?

我试图处理一堆文件,我需要改变,然后删除文件名中的无关信息; 值得注意的是,我试图删除括号内的文字。 例如:

filename = "Example_file_(extra_descriptor).ext" 

我想要将一大堆文件的括号expression式可能在中间或末尾,并且可变长度。

什么样的正则expression式? Perl或Python语法将是首选。

 s/\([^)]*\)// 

所以在Python中,你可以这样做:

 re.sub(r'\([^)]*\)', '', filename) 

我会用:

 \([^)]*\) 

在匹配中没有其他()字符 (例如(xyz 123)Text (abc(xyz 123) )中的字符的子string的模式是

 \([^()]*\) 

详情

  • \( – 一个开放的圆括号(请注意,在POSIX BRE中, (应该使用,见下面的sed例子)
  • [^()]*除了否定字符类 / POSIX括号expression式中定义的字符以外的零个或多个字符(由于* Kleene星号量词 ),也就是除()
  • \) – 一个圆括号(不允许在POSIX BRE中转义)

删除代码片段:

  • JavaScriptstring.replace(/\([^()]*\)/g, '')
  • PHPpreg_replace('~\([^()]*\)~', '', $string)
  • Perl$s =~ s/\([^()]*\)//g
  • Pythonre.sub(r'\([^()]*\)', '', s)
  • C#Regex.Replace(str, @"\([^()]*\)", string.Empty)
  • Regex.Replace(str, "\([^()]*\)", "")
  • Javas.replaceAll("\\([^()]*\\)", "")
  • Rubys.gsub(/\([^()]*\)/, '')
  • Rgsub("\\([^()]*\\)", "", x)
  • Luastring.gsub(s, "%([^()]*%)", "")
  • Bash / sedsed 's/([^()]*)//g'
  • Tclregsub -all {\([^()]*\)} $s "" result
  • C ++ std::regexstd::regex_replace(s, std::regex(R"(\([^()]*\))"), "")
  • Objective-C
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\([^()]*\\)" options:NSRegularExpressionCaseInsensitive error:&error]; NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@""];

如果您不一定需要使用正则expression式,请考虑使用Perl的Text :: Balanced来删除括号。

 use Text::Balanced qw(extract_bracketed); my ($extracted, $remainder, $prefix) = extract_bracketed( $filename, '()', '[^(]*' ); { no warnings 'uninitialized'; $filename = (defined $prefix or defined $remainder) ? $prefix . $remainder : $extracted; } 

你可能会想,“当一个正则expression式在一行中诀窍的时候,为什么要这么做呢?”

 $filename =~ s/\([^}]*\)//; 

Text :: Balanced处理嵌套括号。 所以$filename = 'foo_(bar(baz)buz)).foo'将被正确提取。 这里提供的基于正则expression式的解决scheme将在这个string上失败。 一会停在第一会儿,另一会全吃掉。

$ filename =〜s /([^}] *)//; #返回'foo_buz))。foo'

$ filename =〜s /(.*)//; #返回'foo_.foo'

#文本平衡的例子返回'foo _)。foo'

如果任一正则expression式的行为是可以接受的,则使用正则expression式 – 但要logging正在进行的限制和假设。

如果path可能包含括号,那么r'\(.*?\)'正则expression式是不够的:

 import os, re def remove_parenthesized_chunks(path, safeext=True, safedir=True): dirpath, basename = os.path.split(path) if safedir else ('', path) name, ext = os.path.splitext(basename) if safeext else (basename, '') name = re.sub(r'\(.*?\)', '', name) return os.path.join(dirpath, name+ext) 

默认情况下,该函数在path的目录和扩展部分中保留括号内的块。

例:

 >>> f = remove_parenthesized_chunks >>> f("Example_file_(extra_descriptor).ext") 'Example_file_.ext' >>> path = r"c:\dir_(important)\example(extra).ext(untouchable)" >>> f(path) 'c:\\dir_(important)\\example.ext(untouchable)' >>> f(path, safeext=False) 'c:\\dir_(important)\\example.ext' >>> f(path, safedir=False) 'c:\\dir_\\example.ext(untouchable)' >>> f(path, False, False) 'c:\\dir_\\example.ext' >>> f(r"c:\(extra)\example(extra).ext", safedir=False) 'c:\\\\example.ext' 

如果你可以站在使用sed (可能在你的程序中执行,它会像这样简单:

 sed 's/(.*)//g' 
 >>> import re >>> filename = "Example_file_(extra_descriptor).ext" >>> p = re.compile(r'\([^)]*\)') >>> re.sub(p, '', filename) 'Example_file_.ext' 

Java代码:

 Pattern pattern1 = Pattern.compile("(\\_\\(.*?\\))"); System.out.println(fileName.replace(matcher1.group(1), ""));