我正在尝试处理一堆文件,然后需要进行修改以删除文件名中的无关信息;值得注意的是,我正在尝试删除括号内的文本。例如:
filename = "Example_file_(extra_descriptor).ext"
我想对一整堆文件进行正则表达式,其中括号表达式可能在中间或结尾,并且长度可变。
正则表达式是什么样的?首选Perl或Python语法。
我正在尝试处理一堆文件,然后需要进行修改以删除文件名中的无关信息;值得注意的是,我正在尝试删除括号内的文本。例如:
filename = "Example_file_(extra_descriptor).ext"
我想对一整堆文件进行正则表达式,其中括号表达式可能在中间或结尾,并且长度可变。
正则表达式是什么样的?首选Perl或Python语法。
Answers:
s/\([^)]*\)//
因此,在Python中,您可以这样做:
re.sub(r'\([^)]*\)', '', filename)
在括号匹配子串的图案不具有其他(
和)
字符之间(如(xyz 123)
在Text (abc(xyz 123)
)是
\([^()]*\)
详细资料:
\(
-圆括号(请注意,在POSIX BRE中(
应使用,请参见sed
下面的示例)[^()]*
-除否定的字符类/ POSIX括号表达式中定义的字符以外的零个或多个(由于*
Kleene星型限定符)字符,即和(
)
\)
-封闭的圆括号(不允许在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的文本::平衡删除括号。
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'
将被正确提取。此处提供的基于正则表达式的解决方案在此字符串上将失败。一个会停在第一个封闭的paren,另一个会全部吃光。
$ filename =〜s /([[^}] *)//; #返回'foo_buz))。foo'
$ filename =〜s /(.*)//; #返回'foo_.foo'
#文本平衡示例返回'foo _)。foo'
如果任何一种正则表达式行为都可以接受,请使用正则表达式,但要记录限制和所做的假设。
如果路径可能包含括号,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')
Java代码:
Pattern pattern1 = Pattern.compile("(\\_\\(.*?\\))");
System.out.println(fileName.replace(matcher1.group(1), ""));