简单的python正则表达式问题

时间:2013-10-23 21:06:32

标签: python regex csv

我正在尝试使用正则表达式模块编写一小段代码,该模块将从.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
  3. 我在这里错过了什么?

4 个答案:

答案 0 :(得分: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/)?(.*)/

Regular expression visualization

Debuggex Demo

答案 1 :(得分:1)

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

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

答案 2 :(得分: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)

答案 3 :(得分: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