使用正则表达式

时间:2019-05-23 09:28:02

标签: python regex

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

  

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

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

  

这是我2019年很棒的字符串

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

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

我还可以使用以下命令在括号中找到任何内容:

(\(.*\))

但是,我只想删除所有不是括号中的日期的内容,否则我想保留仅删除括号中的日期。有没有不用if else来做到这一点的方法?

2 个答案:

答案 0 :(得分:2)

在Python 3.5+中,您可以使用

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

如果有( + 4位数字+ ),请仅保留4位数字,否则删除匹配项。

请参见regex demo

详细信息

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

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

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

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

答案 1 :(得分:0)

只需对re.sub进行两次嵌套调用即可:

re.sub(r' ?\(.*\)', '', re.sub(r'\((\d{4})\)', '\\1', my_string))

内部正则表达式在括号中查找4位数字,并删除括号。外部的空格将删除括号中的所有内容(包括开头的可选空格)。