19

这是我的问题:在一个包含逗号的文本变量中,我尝试仅删除位于两个字符串之间的逗号(实际上是[and ])。例如使用以下字符串:

input =  "The sun shines, that's fine [not, for, everyone] and if it rains, it Will Be better."
output = "The sun shines, that's fine [not for everyone] and if it rains, it Will Be better."

我知道如何对.replace整个变量使用,但我不能对其中的一部分使用。这个网站上有一些主题,但我没有设法利用它们来解决我自己的问题,例如:

4

4 回答 4

31
import re
Variable = "The sun shines, that's fine [not, for, everyone] and if it rains, it Will Be better."
Variable1 = re.sub("\[[^]]*\]", lambda x:x.group(0).replace(',',''), Variable)

首先,您需要找到需要重写的字符串部分(您可以使用 执行此操作re.sub)。然后你重写那些部分。

该函数的var1 = re.sub("re", fun, var)意思是:查找 te 变量var中所有符合"re";的子字符串。用函数处理它们fun;返回结果;结果将保存到var1变量中。

[正则表达式“[[^]]*]”表示:查找以( in re)开头的子字符串\[,包含除]( in re) 之外的所有内容并以( in re)[^]]*结尾。]\]

对于每个找到的事件,运行一个函数,将这个事件转换为新的东西。功能是:

lambda x: group(0).replace(',', '')

这意味着:获取找到的字符串 ( group(0)),替换','为(换句话说,''删除)并返回结果。,

于 2012-06-19T08:02:35.357 回答
4

您可以使用这样的表达式来匹配它们(如果括号是平衡的):

,(?=[^][]*\])

使用了类似的东西:

re.sub(r",(?=[^][]*\])", "", str)
于 2012-06-19T08:00:02.487 回答
0

这是一个非正则表达式方法。您可以[]用say [/and替换分隔符/],然后split/分隔符上。然后odd需要处理拆分列表中的每个字符串以进行comma删除,这可以在重建列表理解中的字符串时完成:

>>> Variable = "The sun shines, that's fine [not, for, everyone] and if it rains,
                it Will Be better."
>>> chunks = Variable.replace('[','[/').replace(']','/]').split('/')
>>> ''.join(sen.replace(',','') if i%2 else sen for i, sen in enumerate(chunks))
"The sun shines, that's fine [not for everyone] and if it rains, it Will Be 
 better."
于 2012-06-19T08:31:45.493 回答
-1

如果您不喜欢学习正则表达式(请参阅此页面上的其他回复),您可以使用 partition 命令。

sentence = "the quick, brown [fox, jumped , over] the lazy dog"
left, bracket, rest = sentence.partition("[")
block, bracket, right = rest.partition("]")

“block”现在是括号之间的字符串部分,“left”是左括号的左侧,“right”是左括号的右侧。

然后,您可以使用以下命令恢复完整句子:

new_sentence = left + "[" + block.replace(",","") + "]" + right
print new_sentence # the quick, brown [fox jumped over] the lazy dog

如果你有多个块,你可以把它全部放在一个 for 循环中,在每一步都将分区命令应用到“正确”。

或者你可以学习正则表达式!从长远来看,这将是值得的。

于 2012-06-19T08:16:11.230 回答