首页 > 解决方案 > 使用正则表达式删除日期周围的括号

问题描述

假设我有一个这样的字符串:

这是我的 (2019) 真棒字符串(我想修改)

其中的日期必须保留,但没有括号。同时,括号中的其他所有内容都必须删除。所以我想实现这一点:

这是我的 2019 年很棒的字符串

我可以使用以下方法找到日期:

\b(201\d{1})\b

而且我还可以使用以下方法在括号中找到任何内容:

(\(.*\))

但如果不是括号中的日期,我只想删除所有内容,否则我想保留仅删除括号的日期。有没有办法在不使用的情况下做到这一点if else

标签: pythonregex

解决方案


在 Python 3.5+ 中,您可以使用

s = re.sub(r'\((\d{4})\)|\([^()]*\)', r'\1', s)

如果有(+ 4 位 + ),则只保留 4 位,否则,删除匹配项。

请参阅正则表达式演示

细节

  • \((\d{4})\)- (,然后捕获组 1 匹配四位数字,然后)
  • |- 或者
  • \([^()]*\) - a ,然后是除and之外的(0+ 个字符,然后是.())

替换只是\1对第 1 组值的反向引用。

注意:要在 3.5 之前的 Python 版本中使用这种方法,您必须使用 lambda 表达式作为替换参数(由于错误):

s = re.sub(r'\((\d{4})\)|\([^()]*\)', lambda x: x.group(1) if x.group(1) else '', s)

推荐阅读