如何用正则expression式删除括号内的文本?
我试图处理一堆文件,我需要改变,然后删除文件名中的无关信息; 值得注意的是,我试图删除括号内的文字。 例如:
filename = "Example_file_(extra_descriptor).ext"
我想要将一大堆文件的括号expression式可能在中间或末尾,并且可变长度。
什么样的正则expression式? Perl或Python语法将是首选。
s/\([^)]*\)//
所以在Python中,你可以这样做:
re.sub(r'\([^)]*\)', '', filename)
我会用:
\([^)]*\)
在匹配中没有其他(
和)
字符 (例如(xyz 123)
在Text (abc(xyz 123)
)中的字符的子string的模式是
\([^()]*\)
详情 :
-
\(
– 一个开放的圆括号(请注意,在POSIX BRE中,(
应该使用,见下面的sed
例子) -
[^()]*
– 除了在否定字符类 / POSIX括号expression式中定义的字符以外的零个或多个字符(由于*
Kleene星号量词 ),也就是除(
和)
-
\)
– 一个圆括号(不允许在POSIX BRE中转义)
删除代码片段:
- JavaScript :
string.replace(/\([^()]*\)/g, '')
- PHP :
preg_replace('~\([^()]*\)~', '', $string)
- Perl :
$s =~ s/\([^()]*\)//g
- Python :
re.sub(r'\([^()]*\)', '', s)
- C# :
Regex.Replace(str, @"\([^()]*\)", string.Empty)
-
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"(\([^()]*\))"), "")
- Objective-C :
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\([^()]*\\)" options:NSRegularExpressionCaseInsensitive error:&error]; NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@""];
如果您不一定需要使用正则expression式,请考虑使用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; }
你可能会想,“当一个正则expression式在一行中诀窍的时候,为什么要这么做呢?”
$filename =~ s/\([^}]*\)//;
Text :: Balanced处理嵌套括号。 所以$filename = 'foo_(bar(baz)buz)).foo'
将被正确提取。 这里提供的基于正则expression式的解决scheme将在这个string上失败。 一会停在第一会儿,另一会全吃掉。
$ filename =〜s /([^}] *)//; #返回'foo_buz))。foo'
$ filename =〜s /(.*)//; #返回'foo_.foo'
#文本平衡的例子返回'foo _)。foo'
如果任一正则expression式的行为是可以接受的,则使用正则expression式 – 但要logging正在进行的限制和假设。
如果path可能包含括号,那么r'\(.*?\)'
正则expression式是不够的:
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)
默认情况下,该函数在path的目录和扩展部分中保留括号内的块。
例:
>>> 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'
>>> 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), ""));