在Python中,如果一个字符不属于匹配模式组,则从字符串中删除该字符。

3
如果我有一个包含许多单词的字符串。如果字符串中的单词不以_开头,我想要去掉闭合括号。
示例输入:
this is an example to _remove) brackets under certain) conditions.

输出:

this is an example to _remove) brackets under certain conditions.

我该如何在不使用re.sub拆分单词的情况下完成这个任务?

分割可能会更快 - Padraic Cunningham
2个回答

6

re.sub接受一个可调用对象作为第二个参数,在此处非常方便:

>>> import re
>>> s = 'this is an example to _remove) brackets under certain) conditions.'
>>> re.sub('(\w+)\)', lambda m: m.group(0) if m.group(0).startswith('_') else m.group(1), s)
'this is an example to _remove) brackets under certain conditions.'

2
我不会在这里使用正则表达式,而是使用列表推导式。
result = ' '.join([word.rstrip(")") if not word.startswith("_") else word
                   for word in words.split(" ")])

如果您有类似以下的输入内容:
someword))

that you want to turn into:

someword)

那么你需要做的是:
result = ' '.join([word[:-1] if word.endswith(")") and not word.startswith("_") else word
                  for word in words.split(" ")])

嗯,当我尝试使用re.sub时,你对问题字符串的调用没有任何作用。你有检查过吗?我有遗漏什么吗?还是words被修改了? - timgeb
@timgeb 哎呀,_不是单词字符,所以\b不能按照我想的那样工作(我总是认为\b\s\S之间的边界,实际上它是\w\W之间的边界)。已删除。 - Adam Smith
是的,你可以使用 r'\b[^\W_]+\)' 来实现,但这不能匹配以 ) 结尾且中间有 _ 的字符串。因此,你可以使用 r'\b[^_\W]\w+\)',除非我忽略了某些特殊情况,导致它也无法匹配。 - timgeb
@timgeb 也可以匹配 _word)moreletters - Adam Smith
可能需要指定分隔符以保留任何空格。 - Padraic Cunningham
这实际上比正则表达式快4-5倍,如果你只索引第一个和最后一个字符。 - Padraic Cunningham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接