【问题标题】:How to perform a regex substitution starting from a specific index in Python如何从 Python 中的特定索引开始执行正则表达式替换
【发布时间】:2014-02-12 22:20:28
【问题描述】:

我有两个文件,我通过寻找正则表达式来解析一个文件以替换第二个文件中的字符串。第一个文件是一个 .csv 文件,其中包含第三个索引处的字符串。索引 0-2 只是添加到数据上。

文件 1 中的字符串如下所示:

"foo http://abc bar http://123."
...
...

在文件 2 中,只有一个 URL 列表,用于替换文件 1 中的 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 或同时替换它们两个。例如,我的字符串最终看起来像这个:

"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()

“打印索引”告诉我在哪里找到匹配项,但我不确定如何利用它们来指定应该在哪里进行替换。

感谢您的帮助!

【问题讨论】:

    标签: python regex string


    【解决方案1】:
    site_urls = list(open("urls.txt"))
    def replacer(match):
        return site_urls.pop(0).strip()
    
    re.sub("http[^ ]*",replacer,my_file_text)
    

    我想会做你想做的……

    粗略,因为函数是一行,你可以很容易地用 lambda 替换它......我只是为了说明目的使用了一种普通方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多