【问题标题】:simple python regex issue简单的python正则表达式问题
【发布时间】:2013-11-02 08:30:26
【问题描述】:

我正在尝试使用 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

我在这里错过了什么?

【问题讨论】:

  • 一个包含不同列的 csv 文件。我要读取的列位于 python 读取的字符串的位置 [6]。
  • 我的 Python 不是很流利,但似乎 "if section==re.findall("^go.*", url):" 行实际上与原始 url 匹配,不是在上一行找到的子部分。

标签: python regex csv


【解决方案1】:

试试下面的

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 Demo

【讨论】:

  • 好像还是不行,我试试debuggex工具看看能不能换个角度看看
  • 欢迎来到 SO!我编辑了您的问题以使示例更清晰 - 如果这不是您的意思,请重新编辑!我现在修改了我的答案 - 如果它有效,请告诉我!
【解决方案2】:

您可以直接分析文件的内容,而无需使用 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

【讨论】:

    【解决方案3】:

    从我在别处看到的情况来看,做你正在做的事情的正确方法。

    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)
    

    【讨论】:

      【解决方案4】:

      由于您的第二个正则表达式中的^,这失败了。 go 不在 url 的开头,所以匹配失败。

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

      【讨论】:

        猜你喜欢
        • 2022-11-29
        • 2011-05-13
        • 2011-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-09
        相关资源
        最近更新 更多