预期的字符串或缓冲区(在re.sub中)
问题内容:
我 也
看到了类似的问题(在这里,这里的SO)之前,我知道这re.sub
需要一个字符串(我相信它,我提供的),但我不知道什么是错在下面的代码:
tuples = re.findall(r'id":"(.*?)".*?name":"(.*?)"', response.text, re.DOTALL)
outfile = open("badEXtsWithIDs.csv", "wb")
print "Writing into CSV"
writer = csv.writer(outfile)
for entry in tuples:
writeName = re.sub(r'\W', " ", entry)
writer.writerow(writeName)
我认为这re.sub
需要一个str
变量,但是,不是str
吗?我收到一个错误:TypeError: expected string or buffer
在上有re.sub
。任何帮助表示赞赏。
问题答案:
当您有多个匹配组时,re.findall
返回list
n- tuple
s:
re.findall('(foo).(bar)', 'foo foo bar foo|bar')
Out[5]: [('foo', 'bar'), ('foo', 'bar')]
因此,很明显每个entry
intuples
是一个tuple
。当您将传递tuple
给re.sub
时,它会抱怨。
tuples = re.findall('(foo).(bar)', 'foo foo bar foo|bar')
for entry in tuples:
re.sub('oo','ox',entry)
...
/usr/lib/python3.3/re.py in sub(pattern, repl, string, count, flags)
168 a callable, it's passed the match object and must return
169 a replacement string to be used."""
--> 170 return _compile(pattern, flags).sub(repl, string, count)
171
172 def subn(pattern, repl, string, count=0, flags=0):
TypeError: expected string or buffer
因此,做其他事情。也许使用map
:
for entry in tuples:
print(' '.join(map(lambda s: re.sub('oo','ox',s),entry)))
fox bar
fox bar
或者更容易理解
writer.writerow([re.sub(r'\W', " ",s) for s in entry])
等等