1

正規表現モジュールを使用して、.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/)?(.*)/

正規表現の視覚化

Debuggex デモ

于 2013-10-23T21:11:25.463 に答える
1

これは^、2 番目の正規表現が原因で失敗しています。 goは URL の先頭にないため、一致は失敗しています。

に変更"^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 に答える