web-dev-qa-db-ja.com

正規表現で括弧内のテキストを削除するにはどうすればよいですか?

たくさんのファイルを処理しようとしていますが、ファイル名の余分な情報を削除するために変更する必要があります。特に、括弧内のテキストを削除しようとしています。例えば:

filename = "Example_file_(extra_descriptor).ext"

そして、括弧表現が中央または末尾にある可能性があり、可変長のファイルの束全体を正規表現したいと思います。

正規表現はどのようになりますか? PerlまたはPython構文が推奨されます。

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

Pythonでは、次のようにします。

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

括弧内の部分文字列に一致するパターン間に他の(および)文字がないText (abc(xyz 123)(xyz 123)など)

\([^()]*\)

詳細

  • \(-開始丸括弧(POSIX BREでは、(を使用する必要があることに注意してください。以下のsedの例を参照してください)
  • [^()]*-ゼロ以上(*により Kleene star quantifier )文字以外負の文字クラス/POSIXブラケット式 、つまり、(および)以外の文字
  • \)-閉じ丸括弧(POSIX BREでのエスケープは許可されていません)

コードスニペットの削除:

  • JavaScriptstring.replace(/\([^()]*\)/g, '')
  • [〜#〜] php [〜#〜]preg_replace('~\([^()]*\)~', '', $string)
  • Perl$s =~ s/\([^()]*\)//g
  • Pythonre.sub(r'\([^()]*\)', '', s)
  • C#Regex.Replace(str, @"\([^()]*\)", string.Empty)
  • VB.NETRegex.Replace(str, "\([^()]*\)", "")
  • Javas.replaceAll("\\([^()]*\\)", "")
  • ルビーs.gsub(/\([^()]*\)/, '')
  • [〜#〜] r [〜#〜]gsub("\\([^()]*\\)", "", 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:@""];
  • Swifts.replacingOccurrences(of: "\\([^()]*\\)", with: "", options: [.regularExpression])
33

私は使うだろう:

\([^)]*\)
21
Gumbo

正規表現を絶対に使用する必要がない場合は、 つかいます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;
}
_

「正規表現が1行でトリックを行うのに、なぜこれをすべて行うのか」と考えるかもしれません。

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

Text :: Balancedは、ネストされた括弧を処理します。したがって、$filename = 'foo_(bar(baz)buz)).foo'は適切に抽出されます。ここで提供される正規表現ベースのソリューションは、この文字列では失敗します。 1つは最初の閉じ括弧で停止し、もう1つはすべてを閉じます。

$ filename =〜s /([^}] *)//; #「foo_buz))。foo」を返します

$ filename =〜s /(.*)//; #「foo_.foo」を返します

#テキストバランスの例は 'foo _)。foo'を返します

いずれかの正規表現の動作が許容される場合は、正規表現を使用しますが、制限事項と前提条件を文書化します。

6
daotoad

Pythonを使用したい人のために、ネストされた括弧を持つものを含む、括弧で囲まれた部分文字列を削除する簡単なルーチンを以下に示します。さて、それは正規表現ではありませんが、それは仕事をします!

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

sed(プログラム内から実行される可能性があります)を使用することができれば、次のように簡単になります。

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

パスに括弧が含まれる場合、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'
2
jfs
>>> import re
>>> filename = "Example_file_(extra_descriptor).ext"
>>> p = re.compile(r'\([^)]*\)')
>>> re.sub(p, '', filename)
'Example_file_.ext'
0
riza

Javaコード:

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