1

我正在尝试使用 regex 模块编写一小段代码,该模块将从 .csv 文件中删除部分 url 并将选定的块作为输出返回。如果该部分以 .com/go/ 结尾,我希望它在“go”之后返回内容。这是代码:

import csv
import re

with open('rtdata.csv', 'rb') as fhand:
    reader = csv.reader(fhand)
    for row in reader:
        url=row[6].strip()
        section=re.findall("^http://www.xxxxxxxxx.com/(.*/)", url)
        if section==re.findall("^go.*", url):
            section=re.findall("^http://www.xxxxxxxxx.com/go/(.*/)", url)

        print url
        print section

这是一些示例输入输出:

  1. 示例 1
    1. 输入:http://www.xxxxxxxxx.com/go/news/videos/
    2. 输出:news/videos
  2. 示例 2
    1. 输入:http://www.xxxxxxxxx.com/new-cars/
    2. 输出:new-cars

我在这里想念什么?

4

4 回答 4

2

尝试以下

s = re.search('http://www.xxxxxxxxx.com/(go/)?(.*)/', url)
section = s.group(2)

代替

    section=re.findall("^http://www.xxxxxxxxx.com/(.*/)", url)
    if section==re.findall("^go.*", url):
        section=re.findall("^http://www.xxxxxxxxx.com/go/(.*/)", url)

使用的正则表达式的直观说明:

http://www.xxxxxxxxx.com/(go/)?(.*)/

正则表达式可视化

调试演示

于 2013-10-23T21:11:25.463 回答
1

由于^在您的第二个正则表达式中,这是失败的。 go不在网址的开头,因此匹配失败。

更改"^go.*""go.*"应该可以解决您的问题。

于 2013-10-23T21:14:47.567 回答
0

从我在其他地方看到的情况来看,做你正在做的事情的正确方法。

section=re.match("^http://www.xxxxxxxxx.com/(.*/)", url).group(1)
if re.match("^go.*", section):
    section=re.match("^go/(.*/)", section).group(1)

更好的是,您应该使用单个正则表达式来完成所有这些操作:

section=re.match("^http://www.xxxxxxxxx.com/(go/)?(.*/)", url).group(1)
于 2013-10-23T21:15:44.777 回答
0

您可以直接分析文件的内容,而无需使用 scv 模块功能进行读取:

import re

tata = '''0,1,2,3,4,5, http://www.gagal.com/go/zui ,kkll
00,10,20,30,40,50, http://hardo.fr/glut/popolo , ocean
000,100,200,300,400,500,  http://debeny.cz/rutu/padu/go/gemini/sun=
00,01,02,03,04,05,http://www.klemperer.com/discs/major
000,100,200,300,400,500,  http://www.julia.ch/go/snowy/trf
'''

r = re.compile('^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,'
               ' *(http://[^ ,\n]+?(?:/go/([^ ,\n]+))?(?=[ ,\n]))',
               re.MULTILINE)

print tata

for g1,g2 in r.findall(tata):
    print '%s\n%s\n' % (g1,g2 if g2 else g1)

结果

0,1,2,3,4,5, http://www.gagal.com/go/zui ,kkll
00,10,20,30,40,50, http://hardo.fr/glut/popolo , ocean
000,100,200,300,400,500,  http://debeny.cz/rutu/padu/go/gemini/sun=
00,01,02,03,04,05,http://www.klemperer.com/discs/major
000,100,200,300,400,500,  http://www.julia.ch/go/snowy/trf

http://www.gagal.com/go/zui
zui

http://hardo.fr/glut/popolo
http://hardo.fr/glut/popolo

http://debeny.cz/rutu/padu/go/gemini/sun=
gemini/sun=

http://www.klemperer.com/discs/major
http://www.klemperer.com/discs/major

http://www.julia.ch/go/snowy/trf
snowy/trf
于 2013-10-23T22:05:19.810 回答