假设我有一个像这样的字符串:
这是我(2019)很棒的字符串(我想修改)
其中的日期必须保留,但不能带括号。同时,括号中的所有其他内容都必须删除。所以我想实现这一目标:
这是我2019年很棒的字符串
我可以使用以下方法找到日期:
\b(201\d{1})\b
我还可以使用以下命令在括号中找到任何内容:
(\(.*\))
但是,我只想删除所有不是括号中的日期的内容,否则我想保留仅删除括号中的日期。有没有不用if else
来做到这一点的方法?
答案 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位数字,并删除括号。外部的空格将删除括号中的所有内容(包括开头的可选空格)。