wake-up-neo.com

Wie kann ich Text in Klammern mit einer Regex entfernen?

Ich versuche, eine Reihe von Dateien zu verarbeiten, und ich muss sie dann ändern, um überflüssige Informationen in den Dateinamen zu entfernen. Ich versuche insbesondere, Text in Klammern zu entfernen. Zum Beispiel:

filename = "Example_file_(extra_descriptor).ext"

und ich möchte eine ganze Reihe von Dateien ausdehnen, wobei der Ausdruck in Klammern in der Mitte oder am Ende sein kann und eine variable Länge hat.

Wie würde der Regex aussehen? Perl- oder Python-Syntax wäre bevorzugt.

51
Technical Bard
s/\([^)]*\)//

In Python würden Sie also Folgendes tun:

re.sub(r'\([^)]*\)', '', filename)
85
Can Berk Güder

Das Muster, das mit Teilzeichenfolgen in Klammern übereinstimmt mit keinen anderen Zeichen ( Und ) Dazwischen (wie (xyz 123) In Text (abc(xyz 123)) ist

\([^()]*\)

Details :

  • \( - eine öffnende runde Klammer (beachten Sie, dass in POSIX BRE ( Verwendet werden sollte, siehe sed Beispiel unten)
  • [^()]* - null oder mehr (aufgrund des *Kleene-Stern-Quantifizierer ) Zeichen außer die in - definierten negierte Zeichenklasse/ POSIX-Klammerausdruck , dh alle anderen Zeichen als ( und )
  • \) - eine schließende runde Klammer (kein Ausweichen in POSIX BRE erlaubt)

Code-Schnipsel entfernen:

  • 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"(\([^()]*\))"), "")
  • Ziel-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])
33

Ich würde ... benutzen:

\([^)]*\)
20
Gumbo

Wenn Sie nicht unbedingt einen Regex verwenden müssen, benutzenerwägen Sie die Verwendung von Perls Text :: Balanced , um die Klammer zu entfernen.

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;
}

Sie denken vielleicht: "Warum tun Sie das alles, wenn eine Regex den Trick in einer Zeile macht?"

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

Text :: Balanced behandelt verschachtelte Klammern. $filename = 'foo_(bar(baz)buz)).foo' wird also korrekt extrahiert. Die auf Regex basierenden Lösungen, die hier angeboten werden, schlagen bei dieser Zeichenfolge fehl. Der eine wird beim ersten Schlussteil aufhören, und der andere wird sie alle aufessen.

$ dateiname = ~ s /([^} ←*)//; # gibt 'foo_buz)). foo' zurück

$ filename = ~ s /(.*)// ; # gibt 'foo_.foo' zurück

# Text ausgeglichenes Beispiel gibt 'foo _). foo' zurück

Wenn eines der Regex-Verhalten akzeptabel ist, verwenden Sie einen Regex - dokumentieren Sie jedoch die Einschränkungen und die getroffenen Annahmen.

6
daotoad

Für diejenigen, die Python verwenden möchten, finden Sie hier eine einfache Routine, mit der geklammerte Teilzeichenfolgen entfernt werden, einschließlich der mit geschachtelten Klammern. Okay, es ist keine Regex, aber es wird die Arbeit machen!

def remove_nested_parens(input_str):
    """Returns a copy of 'input_str' with any parenthesized text removed. Nested parentheses are handled."""
    result = ''
    paren_level = 0
    for ch in input_str:
        if ch == '(':
            paren_level += 1
        Elif (ch == ')') and paren_level:
            paren_level -= 1
        Elif not paren_level:
            result += ch
    return result

remove_nested_parens('example_(extra(qualifier)_text)_test(more_parens).ext')
2
Andrew Basile

Wenn Sie sed verwenden können (möglicherweise innerhalb Ihres Programms ausführen, ist das so einfach wie folgt:

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

Wenn ein Pfad Klammern enthalten kann, reicht der r'\(.*?\)' regex nicht aus:

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)

Standardmäßig behält die Funktion geklammerte Abschnitte in Verzeichnis- und Erweiterungsbereichen des Pfads bei.

Beispiel:

>>> 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'
2
jfs
>>> import re
>>> filename = "Example_file_(extra_descriptor).ext"
>>> p = re.compile(r'\([^)]*\)')
>>> re.sub(p, '', filename)
'Example_file_.ext'
0
riza

Java-Code:

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