【问题标题】:Removing parentheses around a date using regex使用正则表达式删除日期周围的括号
【发布时间】:2019-05-23 09:28:01
【问题描述】:

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

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

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

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

我可以使用这个找到日期:

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

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

(\(.*\))

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

【问题讨论】:

  • “日期”是指 201X 格式的年份吗?
  • 是的,格式为 201X 的年份

标签: python regex


【解决方案1】:

在 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)

【讨论】:

  • @Sweeper 对,对于 Python 3.5 及更高版本,替换模式中的反向引用将起作用。但是,对于旧版本,它仍然需要带有 if else 的 lambda 表达式。
  • @WiktorStribiżew 出于好奇,是否可以说,替换括号之间的所有内容,除非它包含 4 个数字?一直在尝试re.sub('\(^(?:\d{4})\)','', s),但没有运气。 ^ 是否不适用于非捕获组?
  • @yatu 这是我看到这个问题时写的第一个模式:):re.sub(r'\((?!\d{4}\))[^()]*\)','', s),见this regex demo
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-22
    • 2020-02-14
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 2014-10-09
    • 1970-01-01
    相关资源
    最近更新 更多