2012-11-22 62 views
2

我有这样的代码正则表达式不与蟒蛇正常工作

site = hxs.select("//h1[@class='state']") 
mydata = site.select("string()").extract() 
cleaned_mydata = re.sub(ur'(\s)\s+', ur'\1', mydata[0], flags=re.MULTILINE + re.UNICODE) 

     log.msg(str(mydata),level=log.ERROR) 
     log.msg(str(cleaned_mydata),level=log.ERROR) 

第一输出

ERROR: [u'\r\n 212\r\n jobs containing php in xxxx \r\n ']

其他输出

jobs containing php in xxxxxx

正则表达式也剥离212数字与它。我该如何解决这个问题

+0

什么是你想匹配? – npinti

+0

我试图删除多个空格和结束行。我从互联网复制这个,我不知道它究竟做了什么 – user825904

+2

作为一个测试,为什么不替换可见的东西,而不是:ur'\ 1',使用:'XYZ'。在运行正则表达式之前,为什么不移除\ r \ n?此外,当使用标志=他们应该OR'd在一起,而不是ADDED(即使用|不+ +) – fileoffset

回答

1

问题是,这个正则表达式留下了它找到的第一个空格,并且只剥去了后面的空格。

这意味着

u'\r\n 212\r\n jobs containing php in xxxx \r\n ' 

变得

u'\r212\rjobs containing php in xxxx ' 

当打印为此,212将被打印,则一个回车将光标返回到第一个列,从而使以下jobs...将覆盖212

这就产生了两个问题:

  • 你似乎是阅读二进制模式的文本文件(否则\r\n将被标准化为\n S) - 为什么?
  • 你真的想要正则表达式以这种方式工作吗?

编辑:

因此,根据您的意见,要

  • 带前后空白完全
  • 凝结多个连续的空格字符转换成一个空格(ASCII 32)。

然后使用

cleaned_mydata = re.sub(r'\s+', ' ', mydata[0].strip()) 
+0

我用Scrapy报废网站,并在那里使用。我不知道为什么会出现这种情况。我只想删除blamk空间并\ r \ n – user825904

+0

@ user32:请更具体。什么*确切*你想要删除?我不认为你想让你的结果成为'212jobscontainingphpinxxxx'。 –

+0

我想要的结果是“包含在xxx中的php的212个作业” – user825904