使用regex删除日期的圆括号

2024-04-23 22:26:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

This is my (2019) awesome string (that I want to modify)

其中的日期必须保留,但没有括号。同时,括号里的所有东西都必须放进去。所以我想实现这一点:

This is my 2019 awesome string

我可以用这个来定位日期:

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

我也能用这个找到括号里的任何东西:

(\(.*\))

但我只想删除括号中没有日期的所有内容,否则我只想保留括号中的日期。有没有不使用if else的方法?你知道吗


Tags: to字符串定位内容stringifthatis
2条回答

在python3.5+中,您可以使用

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

如果有一个(+4个数字+),只保留这4个数字,否则,删除匹配项。你知道吗

参见regex demo。你知道吗

细节

  • \((\d{4})\)-(,然后捕获匹配四位数字的组1,然后)
  • |-或
  • \([^()]*\)-a(,然后是除()之外的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)

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

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

内部正则表达式在括号中查找4位数字并删除括号。外部的一个删除了括号中剩下的所有内容(包括开头的可选空格)。你知道吗

相关问题 更多 >