たくさんのファイルを処理しようとしていますが、ファイル名の余分な情報を削除するために変更する必要があります。特に、括弧内のテキストを削除しようとしています。例えば:
filename = "Example_file_(extra_descriptor).ext"
そして、括弧表現が中央または末尾にある可能性があり、可変長のファイルの束全体を正規表現したいと思います。
正規表現はどのようになりますか? PerlまたはPython構文が推奨されます。
s/\([^)]*\)//
Pythonでは、次のようにします。
re.sub(r'\([^)]*\)', '', filename)
括弧内の部分文字列に一致するパターン間に他の(
および)
文字がない(Text (abc(xyz 123)
の(xyz 123)
など)
\([^()]*\)
詳細:
\(
-開始丸括弧(POSIX BREでは、(
を使用する必要があることに注意してください。以下のsed
の例を参照してください)[^()]*
-ゼロ以上(*
により Kleene star quantifier )文字以外負の文字クラス/POSIXブラケット式 、つまり、(
および)
以外の文字\)
-閉じ丸括弧(POSIX BREでのエスケープは許可されていません)コードスニペットの削除:
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])
私は使うだろう:
\([^)]*\)
正規表現を絶対に使用する必要がない場合は、 つかいます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'を返します
いずれかの正規表現の動作が許容される場合は、正規表現を使用しますが、制限事項と前提条件を文書化します。
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')
sed
(プログラム内から実行される可能性があります)を使用することができれば、次のように簡単になります。
sed 's/(.*)//g'
パスに括弧が含まれる場合、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'
>>> import re
>>> filename = "Example_file_(extra_descriptor).ext"
>>> p = re.compile(r'\([^)]*\)')
>>> re.sub(p, '', filename)
'Example_file_.ext'
Javaコード:
Pattern pattern1 = Pattern.compile("(\\_\\(.*?\\))");
System.out.println(fileName.replace(matcher1.group(1), ""));