繁体   English   中英

正则表达式多个括号并删除一个具有特定模式的括号

[英]Regex multiple parenthesis and remove one with specific pattern

我有多个括号,想删除至少有一个数字的括号。

我尝试了以下方法。 但是,由于它是贪心的,它会将第一个左括号删除到最后一个右括号。 我还尝试通过排除左括号来破坏贪婪功能,但没有奏效。

names = ['d((123))', 'd(1a)(ab)', 'd(1a)(ab)(123)']
data = pd.DataFrame(names, columns = ['name'])

print(data.name.str.replace("\(.*?\d+.*?\)", ""))
# Output: ['d)', 'd(ab)', 'd']

print(data.name.str.replace("\((?!\().*[\d]+(?!\().*\)",""))
# Output: ['d(', 'd', 'd']

# desired output: ['d', 'd(ab)', 'd(ab)']

此正则表达式似乎有效: \([^)\d]*?\d+[^)]*?\)+

>>> pattern = '\([^)\d]*?\d+[^)]*?\)+'
>>> names = ['d((123))', 'd(1a)(ab)', 'd(1a)(ab)(123)']
>>> [re.sub(pattern, '', x) for x in names]
['d', 'd(ab)', 'd(ab)']

我不知道是否有更复杂的案例,但对于您提供的类似案例,它应该可以解决问题。

虽然Python不支持recursive regex ,但您可以通过安装regex模块来启用它:

pip install regex

然后你可以这样说:

import regex

names = ['d((123))', 'd(1a)(ab)', 'd(1a)(ab)(123)']
pattern = r'\((?:[^()]*?\d[^()]*?|(?R))+\)'
print ([regex.sub(pattern, '', x) for x in names])

Output:

['d', 'd(ab)', 'd(ab)']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM