Ответ 1
s/\([^)]*\)//
Итак, в Python вы бы сделали:
re.sub(r'\([^)]*\)', '', filename)
Я пытаюсь обрабатывать множество файлов, и мне нужно изменить их, чтобы удалить посторонние данные в именах файлов; в частности, я пытаюсь удалить текст в круглых скобках. Например:
filename = "Example_file_(extra_descriptor).ext"
и я хочу повторно выделить целую кучу файлов, где выражение в скобках может находиться в середине или в конце и переменной длины.
Как будет выглядеть регулярное выражение? Предпочтительным будет синтаксис Perl или Python.
s/\([^)]*\)//
Итак, в Python вы бы сделали:
re.sub(r'\([^)]*\)', '', filename)
Шаблон, который соответствует подстрокам в круглых скобках, между которыми нет других (
и )
символов (например, (xyz 123)
в Text (abc(xyz 123)
),
\([^()]*\)
Детали:
\(
- открывающая круглая скобка (обратите внимание, что в POSIX BRE, (
следует использовать, см. пример sed
ниже)[^()]*
- ноль или более (из-за *
звездного квантификатора Клини) символов, отличных от тех, которые определены в выражении класса отрицанных символов/скобках 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;
}
Вы можете подумать: "Зачем все это, когда регулярное выражение делает трюк в одной строке?"
$filename =~ s/\([^}]*\)//;
Text :: Сбалансированный обрабатывает вложенные скобки. Таким образом, $filename = 'foo_(bar(baz)buz)).foo'
будет извлечен правильно. Предлагаемые здесь решения на основе регулярных выражений потерпят неудачу в этой строке. Один остановится на первом закрытии, а другой съест их всех.
$ filename = ~ s/([^}] *)//; # возвращает 'foo_buz)). foo'
$ filename = ~ s/(.*)//; # возвращает 'foo_.foo'
# text сбалансированный пример возвращает 'foo _). foo'
Если любое из поведений регулярного выражения является приемлемым, используйте регулярное выражение - но задокументируйте ограничения и сделанные предположения.
Если вы можете использовать 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'
Для тех, кто хочет использовать 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')
>>> 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), ""));