Ich versuche, eine Reihe von Dateien zu verarbeiten, und ich muss sie dann ändern, um überflüssige Informationen in den Dateinamen zu entfernen. Insbesondere versuche ich, Text in Klammern zu entfernen. Zum Beispiel:
filename = "Example_file_(extra_descriptor).ext"
und ich möchte eine ganze Reihe von Dateien neu ausdrücken, wobei der Ausdruck in Klammern in der Mitte oder am Ende stehen kann und von variabler Länge ist.
Wie würde der Regex aussehen? Perl- oder Python-Syntax wäre bevorzugt.
Antworten:
s/\([^)]*\)//
In Python würden Sie also Folgendes tun:
re.sub(r'\([^)]*\)', '', filename)
quelle
Das Muster, das Teilzeichenfolgen in Klammern ohne andere
(
und)
dazwischen liegende Zeichen (wie(xyz 123)
inText (abc(xyz 123)
) entspricht, ist\([^()]*\)
Details :
\(
- eine öffnende runde Halterung (beachten Sie, dass in POSIX BRE verwendet werden(
sollte, siehesed
Beispiel unten)[^()]*
- Null oder mehr Zeichen (aufgrund des*
Kleene-Sternquantifizierers ) als die im Ausdruck der negierten Zeichenklasse / POSIX-Klammer definierten Zeichen , dh alle anderen Zeichen als(
und)
\)
- eine schließende runde Klammer (kein Entweichen in POSIX BRE erlaubt)Codefragmente entfernen:
string.replace(/\([^()]*\)/g, '')
preg_replace('~\([^()]*\)~', '', $string)
$s =~ s/\([^()]*\)//g
re.sub(r'\([^()]*\)', '', s)
Regex.Replace(str, @"\([^()]*\)", string.Empty)
Regex.Replace(str, "\([^()]*\)", "")
s.replaceAll("\\([^()]*\\)", "")
s.gsub(/\([^()]*\)/, '')
gsub("\\([^()]*\\)", "", x)
string.gsub(s, "%([^()]*%)", "")
sed 's/([^()]*)//g'
regsub -all {\([^()]*\)} $s "" result
std::regex
:std::regex_replace(s, std::regex(R"(\([^()]*\))"), "")
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\([^()]*\\)" options:NSRegularExpressionCaseInsensitive error:&error]; NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@""];
s.replacingOccurrences(of: "\\([^()]*\\)", with: "", options: [.regularExpression])
quelle
Ich würde ... benutzen:
\([^)]*\)
quelle
Wenn Sie nicht unbedingt einen regulären Ausdruck
verwendenmüssen, sollten Sie Perls Text :: Balanced verwenden , um die Klammern 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 das alles, wenn ein Regex den Trick in einer Zeile macht?"
$filename =~ s/\([^}]*\)//;
Text :: Balanced behandelt verschachtelte Klammern. Also
$filename = 'foo_(bar(baz)buz)).foo'
wird richtig extrahiert. Die hier angebotenen Regex-basierten Lösungen schlagen bei dieser Zeichenfolge fehl. Der eine wird beim ersten schließenden Paren anhalten und der andere wird sie alle essen.$ filename = ~ s / ([^}] *) //; # gibt 'foo_buz)) zurück. foo'
$ filename = ~ s /(.*)//; # gibt 'foo_.foo' zurück
# text balanciertes Beispiel gibt 'foo _) zurück. foo'
Wenn eines der Regex-Verhaltensweisen akzeptabel ist, verwenden Sie einen Regex - dokumentieren Sie jedoch die Einschränkungen und die getroffenen Annahmen.
quelle
Wenn ein Pfad Klammern enthalten kann, reicht der
r'\(.*?\)'
reguläre Ausdruck 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 Klammern in Klammern in Verzeichnis- und Erweiterungsteilen 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'
quelle
Für diejenigen, die Python verwenden möchten, ist hier eine einfache Routine, die in Klammern gesetzte Teilzeichenfolgen entfernt, einschließlich solcher mit verschachtelten Klammern. Okay, es ist kein regulärer Ausdruck, aber es wird den Job 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')
quelle
Wenn Sie es verwenden können
sed
(möglicherweise aus Ihrem Programm heraus ausführen), ist dies so einfach wie:sed 's/(.*)//g'
quelle
.*
.>>> import re >>> filename = "Example_file_(extra_descriptor).ext" >>> p = re.compile(r'\([^)]*\)') >>> re.sub(p, '', filename) 'Example_file_.ext'
quelle
Java-Code:
Pattern pattern1 = Pattern.compile("(\\_\\(.*?\\))"); System.out.println(fileName.replace(matcher1.group(1), ""));
quelle