【问题标题】:Regex and csv issues in python 2.7python 2.7 中的正则表达式和 csv 问题
【发布时间】:2011-12-29 04:47:03
【问题描述】:

使用以下解决问题(对于剩余的问题,将更改我的代码)。对不起,我最初的帖子中的代码格式不正确。

import csv, re, mechanize  

htmlML = br.response().read() 

#escaping ? fixed the regex match 
patMemberName = re.compile('<a href=/foo.php\?XID=(d+) ><font color=#000000><b>(.*) </b>') 
searchMemberName = re.findall(patMemberName,htmlML)

MembersCsv = 'path-to-csv' 
MemberWriter = csv.writer(open(MembersCsv, 'wb')) #adding b fixed the \n in csv

for i in searchMemberName:
    MemberWriter.writerow(i)
    print (i)

感谢您的宝贵时间

【问题讨论】:

  • 在正则表达式中,问号表示“零或前一个字符类”,句点表示“任何字符”。因此,当您说 .php? 时,您并不是真的在寻找 .php?。试试 [.]php[?]
  • 如果您使用 Python2,请将 csv.writer(open(MembersCsv, 'w')) 更改为 csv.writer(open(MembersCsv, 'wb'))(因为 Python2 希望以二进制形式打开 csv 文件)。无论 Python 版本如何,将 MemberWriter.writerow(i) 更改为 MemberWriter.writerow([i])(因为 writerow 想要一行项目——目前它将每个字符解释为一个项目)。最后,如果每行只有一个项目,你真的需要 csv 吗?
  • 不要使用正则表达式解析 html。见stackoverflow.com/questions/2861/options-for-html-scraping
  • 另外,这个问题如果分成两个问题会更好。
  • @k3rb3r05,StackOverflow 有非常好的格式化能力;请learn to use them。我试图自己重新格式化问题,但我什至不知道你在尝试什么。

标签: python regex csv screen-scraping


【解决方案1】:

不幸的是,我现在找不到适合 Python 的转义序列。通常,您会使用不应在“\Q...\E”中解释的元字符来包装表达式。

尝试用 re.escape(string) 包裹你的字符串。所以:

re.compile(re.escape('<font color=#000000><b>(.*)</b>'))

【讨论】:

    【解决方案2】:

    对于问题 1),您必须将模式中的 ? 转义。

    import re
    
    htmlML = '<a href=/foo.php?XID=123 ><font color=#000000><b>user</b>'
    patMemberID = re.compile('<a href=/foo.php\?XID=(\d*) ><font color=#000000><b>user</b>')
    
    searchMemberID = re.findall(patMemberID, htmlML)
    print len(searchMemberID)
    
    for i in searchMemberID:
        print (i)
    

    那么123就可以从字符串中提取出来了

    问题 2a)

    您可以使用(.*?) 替换some string? 表示非贪婪匹配

    【讨论】:

    • 请不要忘记这段时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2023-03-29
    • 2010-11-22
    • 1970-01-01
    • 2010-10-20
    • 2014-11-29
    相关资源
    最近更新 更多