如何使用正则表达式删除括号内的文本?

时间:2009-03-12 18:56:57

标签: python regex perl

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

filename = "Example_file_(extra_descriptor).ext"

我希望正则表达一大堆文件,其中括号表达式可能位于中间或末尾,且长度可变。

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

9 个答案:

答案 0 :(得分:90)

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

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

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

答案 1 :(得分:28)

匹配括号之间没有其他()字符的子字符串的模式(如(xyz 123)中的Text (abc(xyz 123))< / p>

\([^()]*\)

<强>详情:

删除代码段:

  • JavaScript string.replace(/\([^()]*\)/g, '')
  • PHP preg_replace('~\([^()]*\)~', '', $string)
  • Perl $s =~ s/\([^()]*\)//g
  • Python re.sub(r'\([^()]*\)', '', s)
  • C#Regex.Replace(str, @"\([^()]*\)", string.Empty)
  • VB.NET Regex.Replace(str, "\([^()]*\)", "")
  • Java s.replaceAll("\\([^()]*\\)", "")
  • Ruby s.gsub(/\([^()]*\)/, '')
  • R gsub("\\([^()]*\\)", "", x)
  • Lua string.gsub(s, "%([^()]*%)", "")
  • Bash / sed sed 's/([^()]*)//g'
  • Tcl regsub -all {\([^()]*\)} $s "" result
  • C ++ std::regex std::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:@""];
  • Swift s.replacingOccurrences(of: "\\([^()]*\\)", with: "", options: [.regularExpression])

答案 2 :(得分:21)

我会用:

\([^)]*\)

答案 3 :(得分:6)

如果你不是绝对需要使用正则表达式,使用考虑使用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;
}

你可能会想,“为什么当一个正则表达式在一行中完成所有这一切?”

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

Text :: Balanced处理嵌套括号。因此$filename = 'foo_(bar(baz)buz)).foo'将被正确提取。这里提供的基于正则表达式的解决方案将在此字符串上失败。一个人将在第一个关闭的paren停止,另一个将全部吃掉。

$ filename = ~s /([^}] *)//;    #wurn'foo_buz))。foo'

$ filename = ~s /(.*)//;    #wurn'foo_.foo'

#text balanced example返回'foo _)。foo'

如果正则表达式行为中的任何一个是可接受的,请使用正则表达式 - 但要记录限制和假设。

答案 4 :(得分:2)

如果您可以使用sed(可能在您的程序中执行,它就像:

sed 's/(.*)//g'

答案 5 :(得分:2)

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

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)

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

示例:

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

答案 6 :(得分:2)

对于那些想要使用Python的人来说,这是一个简单的例程,可以删除带括号的子串,包括带有嵌套括号的子串。好吧,它不是一个正则表达式,但它会完成这项工作!

this.WhenActivated(disposables => {});

答案 7 :(得分:0)

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

答案 8 :(得分:0)

Java代码:

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