2013-10-23 17 views
1

我想使用正則表達式模塊編寫一小段代碼,該模塊將從.csv文件中刪除一部分url並將選定的塊返回爲輸出。如果該部分以.com/go /結尾,我希望它在「去」之後返回內容。下面的代碼:簡單的Python正則表達式問題

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

我缺少什麼嗎?

+0

什麼是輸入? –

+0

具有各種列的csv文件。我想讀取的列位於字符串python的位置[6]中。 – Mike

+0

我不太流利的Python,但它好像是「if section == re.findall(」^ go。*「,url ):「行實際上是匹配原始網址,而不是在上一行找到的子網段。 – jwatkins

回答

1

這是因爲你的第二個正則表達式中的^失敗。 go不在網址的開頭,所以匹配失敗。

"^go.*"更改爲"go.*"應該可以解決您的問題。

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

+0

似乎沒有工作,不幸的是 – Mike

+0

仍然似乎沒有工作,我會嘗試debuggex工具,看看我不能從另一個角度看看它 – Mike

+0

歡迎來到SO!我編輯了你的問題,使例子更清晰 - 如果這不是你的意思,請編輯回來!我現在修改了我的答案 - 讓我知道它是否有效! – arturomp

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