2016-05-12 69 views
-3

我一直在试图做一个re.sub来替换我的python字符串中的重复字符串,并且已经击中墙壁。在Python中解析文本的问题

我试图查找和替换字符串为" *. in *."所有这些是文字,即不重复的空间,然后什么等等等等

我已经尝试了很多东西,这里是目前的一个在我的控制台:

message = re.sub(r"([\s][*][.][\s]in[\s][*][.])+", " *. in *.",message) 

有人能以我的方式指出我的错误吗?

+0

好了,你想*收缩*多“*。*中。”只有一个?请参阅http://ideone.com/wgEVsR。如果你启用了're.U'标志,'\ s'也会加速所有的Unicode空格。尝试在[\ s] [*] [。])+“,”*。in *。“中输入message = re.sub(r”([\ s] [*] [。] [\ s]), ,flags = re.U)' –

+0

首先你应该逃避点:'[\。]' –

+3

@Shionion:不,一个人不需要逃避角色类中的点。 –

回答

0

你的正则表达式是笨重的,但它的工作原理。问题是你与替换它完全一样的字符串

>>> import re 
>>> message = 'string I am trying to find and replace is " *. in *." All those are literal' 
>>> re.sub(r"([\s][*][.][\s]in[\s][*][.])+", " *. in *.", message) 
'string I am trying to find and replace is " *. in *." All those are literal' 
>>> re.sub(r"([\s][*][.][\s]in[\s][*][.])+", "wot", message) 
'string I am trying to find and replace is "wot" All those are literal' 

看到了吗?有用!

你的正则表达式是“笨重”,因为你想要的只有两个神奇字符匹配字面上*.。尽管方括号的确可以消除它们的魔法属性,但通常的做法是用反斜线来避开它们。所有其他字符和顺序做需要支架,所以你需要的是

re.sub(r"(\s\*\.\sin\s\*\.)+", "wot", message) 
+0

*我一直在尝试做一个re.sub来替换一个**重复的**字符串* - OP试图收缩几个重复的子字符串只发生一次。看到我对这个问题的评论。 OP正则表达式和解决方案正常工作。或者应该工作。 –

+0

@WiktorStribiżew:我刚刚测试过重复出现的*。在* .'中,这仍然有效。一串文字重复被一个单独的“wot”替换,单个出现也是如此。那么OP应该添加更多的例子。 – usr2564301

+0

感谢您的努力。我复制并粘贴了上面的几条建议,重复的字符串仍然没有缩小。当我使用“wot”替换时,字符串变成“wot in wot”。为了解决这个问题,我改变了战术,首先取代了“*”。与另一个字符串,然后缩小基本上由Wiktor和Rad建议的代码。 –