我正在处理一堆文件,需要修改它们以删除文件名中的无关信息。尤其是我想要删除括号内的文本。例如:
filename = "Example_file_(extra_descriptor).ext"
我想对一大堆文件进行正则表达式匹配,其中括号表达式可能在中间或结尾,并且长度不固定。
这个正则表达式应该是什么样的呢?最好使用Perl或Python语法。
我正在处理一堆文件,需要修改它们以删除文件名中的无关信息。尤其是我想要删除括号内的文本。例如:
filename = "Example_file_(extra_descriptor).ext"
我想对一大堆文件进行正则表达式匹配,其中括号表达式可能在中间或结尾,并且长度不固定。
这个正则表达式应该是什么样的呢?最好使用Perl或Python语法。
s/\([^)]*\)//
那么在 Python 中,你需要这样做:
re.sub(r'\([^)]*\)', '', filename)
\([^)]*\)
。 - DiB匹配在括号中 没有其他的(
和)
字符存在的子字符串(例如(xyz 123)
在Text (abc(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])
REGEXP_REPLACE(col, "\\([^()]*\\)" , "")
[
而不是圆括号,那么在[^ ]
结构中是否需要转义它们,例如[^\\[\\]]
,或者像其他字符一样不需要转义? - Anoushiravan R我会使用:
\([^)]*\)
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::Balanced可以处理嵌套的括号。因此,$filename = 'foo_(bar(baz)buz)).foo'
将被正确提取。在此处提供的基于正则表达式的解决方案将无法处理此字符串。其中一个会停在第一个闭合括号处,而另一个则会将所有括号都吃掉。
$filename =~ s/\([^}]*\)//;
# returns 'foo_buz)).foo'
$filename =~ s/\(.*\)//;
# returns 'foo_.foo'
# text balanced example returns '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')
如果路径中可能包含括号,则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'
sed
(可能在程序内部执行),那么它将非常简单:sed 's/(.*)//g'
.*
进行分组。 - Gumbo>>> 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), ""));