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

Tec*_*ard 61 python regex perl

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

filename = "Example_file_(extra_descriptor).ext"
Run Code Online (Sandbox Code Playgroud)

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

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

Can*_*der 106

s/\([^)]*\)//
Run Code Online (Sandbox Code Playgroud)

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

re.sub(r'\([^)]*\)', '', filename)
Run Code Online (Sandbox Code Playgroud)

  • .*获得第一个左边的paren和最后一个paren之间的所有内容:'a(b)c(d)e'将变为'ae'.[^]]*仅在第一个左边的paren和第一个右边的paren之间移除:'ac(d)e'.您还将获得嵌套parens的不同行为. (13认同)
  • 有什么理由喜欢.*?超过[^]]* (2认同)

Wik*_*żew 38

在paretheses匹配子串的图案不具有其他()字符之间(如(xyz 123)Text (abc(xyz 123))是

\([^()]*\)
Run Code Online (Sandbox Code Playgroud)

细节:

  • \(- 开口圆括号(请注意,在POSIX BRE中,(应使用,请参见sed下面的示例)
  • [^()]*- 除了否定字符类/POSIX括号表达式中定义的字符之外的零或更多(由于* Kleene星形量词)字符,即除了和之外的任何字符()
  • \) - 关闭圆括号(不允许在POSIX BRE中转义)

删除代码段:

  • 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:@""];


dao*_*oad 6

如果你不绝对需要使用正则表达式,使用考虑使用Perl的文本::平衡删除括号.

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;
}
Run Code Online (Sandbox Code Playgroud)

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

$filename =~ s/\([^}]*\)//;
Run Code Online (Sandbox Code Playgroud)

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'

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