我有两个文件,我通过查找正则表达式来解析一个文件来替换第二个文件中的字符串。第一个文件是.csv文件,其中包含第三个索引处的字符串。索引0-2刚刚添加到数据上。
文件1中的字符串如下所示:
"foo http://abc bar http://123."
...
...
在文件2中,只有一个URL列表,用于替换file1中找到的URL。
文件2如下所示:
"http://def"
"http://456"
...
...
我首先遍历文件1,查找URL。当我找到一个URL时,我用文件2中的URL替换它,然后转到下一个URL。这一切都是按顺序完成的,因此在替换文件1中的URL时,不会重复文件2中的URL。
解析完成后得到的字符串应如下所示:
"foo http://def bar http://456"
我的问题是,当使用re.sub执行替换时,我只能用文件2中的相同URL同时替换第一个URL或两个URL。例如,我的字符串最终看起来像这样:
"foo http://def bar http://def"
有没有办法可以使用re.sub替换第一个URL,然后跟踪它在字符串中的位置,这样当它到达第二个URL时,它将用文件2中的相应URL替换它?
我写的代码如下:
shortened = open('shortenedURLs.txt','r')
linesReadfromFile = shortened.readlines()
newRetweet = open('new_Retweet.csv','w')
with open('tweets_nurl.csv','rb') as inputfile1:
read=csv.reader(inputfile1, delimiter=',')
a = 0
for row in read:
url = re.findall('https*://', row[3])
if url:
for i in xrange(len(url)):
currentLine=row[3].rstrip('\n')
if re.search('http://', row[3]):
iter = re.finditer(r'http://',row[3])
indices = [m.start(0) for m in iter]
print indices
currentLine=re.sub(r'http://[^\s]*', linesReadfromFile[a].rstrip('\n'), currentLine, count=1)
a=a+1
if re.search('https://',row[3]):
currentLine = re.sub(r'https://[^\s]*', linesReadfromFile[a].rstrip('\n'), currentLine)
a=a+1
newRetweet.write(row[0]+","+row[1]+","+row[2]+","+currentLine+'\n')
else:
newRetweet.write(','.join(row)+'\n')
shortened.close()
newRetweet.close()
“打印索引”告诉我匹配的位置,但我不知道如何利用它们来指定替换应该在何处进行。
感谢您的帮助!
答案 0 :(得分:1)
site_urls = list(open("urls.txt"))
def replacer(match):
return site_urls.pop(0).strip()
re.sub("http[^ ]*",replacer,my_file_text)
我认为会做你想做的......
粗,因为函数是一行你可以很容易地用lambda替换它...我只是用一个常规方法来说明目的