Как удалить текст в круглых скобках с помощью регулярного выражения?

Я пытаюсь обрабатывать множество файлов, и мне нужно изменить их, чтобы удалить посторонние данные в именах файлов; в частности, я пытаюсь удалить текст в круглых скобках. Например:

filename = "Example_file_(extra_descriptor).ext"

и я хочу повторно выделить целую кучу файлов, где выражение в скобках может находиться в середине или в конце и переменной длины.

Как будет выглядеть регулярное выражение? Предпочтительным будет синтаксис Perl или Python.

Ответ 1

s/\([^)]*\)//

Итак, в Python вы бы сделали:

re.sub(r'\([^)]*\)', '', filename)

Ответ 2

Шаблон, который соответствует подстрокам в круглых скобках, между которыми нет других ( и ) символов (например, (xyz 123) в Text (abc(xyz 123)),

\([^()]*\)

Детали:

Удаление фрагментов кода:

  • JavaScript: string.replace(/\([^()]*\)/g, '')
  • PHP: preg_replace('~\([^()]*\)~', '', $string)
  • Perl: $s =~ s/\([^()]*\)//g
  • Python: re.sub(r'\([^()]*\)', '', s)
  • С#: 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"(\([^()]*\))"), "")
  • Цель-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])

Ответ 3

Я бы использовал:

\([^)]*\)

Ответ 4

Если вы не абсолютно необходимо использовать регулярное выражение, используйте рассмотреть возможность использования 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;
}

Вы можете подумать: "Зачем все это, когда регулярное выражение делает трюк в одной строке?"

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

Text :: Сбалансированный обрабатывает вложенные скобки. Таким образом, $filename = 'foo_(bar(baz)buz)).foo' будет извлечен правильно. Предлагаемые здесь решения на основе регулярных выражений потерпят неудачу в этой строке. Один остановится на первом закрытии, а другой съест их всех.

$ filename = ~ s/([^}] *)//; # возвращает 'foo_buz)). foo'

$ filename = ~ s/(.*)//; # возвращает 'foo_.foo'

# text сбалансированный пример возвращает 'foo _). foo'

Если любое из поведений регулярного выражения является приемлемым, используйте регулярное выражение - но задокументируйте ограничения и сделанные предположения.

Ответ 5

Если вы можете использовать sed (возможно, выполнить из вашей программы, это будет так же просто, как:

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

Ответ 6

Если путь может содержать круглые скобки, то регулярное выражение 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'

Ответ 7

Для тех, кто хочет использовать 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')

Ответ 8

>>> import re
>>> filename = "Example_file_(extra_descriptor).ext"
>>> p = re.compile(r'\([^)]*\)')
>>> re.sub(p, '', filename)
'Example_file_.ext'

Ответ 9

Код Java:

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