2

所以我试图在 python 上做得更好,但是我在使用 re 模块进行正则表达式时遇到了一些麻烦。

我有一个逗号分隔的 csv 文件,我正在读取它,然后我想找到所有以逗号 5 结尾的行。所以我使用了下面的代码:

    five_rating = re.compile(r",5$", re.MULTILINE)
    print five_rating.findall(file.read())

但我没有得到任何输出。肯定有与我正在使用的正则表达式匹配的事件,我已经在 python 正则表达式网站上测试了我的正则表达式,它们模拟了我想要的,但是在代码中,它只是不起作用!

有什么明显的我做错了吗?

哦,我使用的是 Ubuntu,文件应该有 DOS 样式的行尾,但我尝试使用这篇文章中的代码转换尾行字符,但没有成功。

顺便说一句,这是输入的示例:

9605,Ace Ventura: Pet Detective,5
9606,Ace Ventura: Pet Detective,1
9607,Ace Ventura: Pet Detective,4
9608,Ace Ventura: Pet Detective,3
9609,Ace Ventura: Pet Detective,2
9610,Ace Ventura: Pet Detective,4
9611,Ace Ventura: Pet Detective,3
9612,Ace Ventura: Pet Detective,4
9613,Ace Ventura: Pet Detective,5
9614,Ace Ventura: Pet Detective,5
9615,Ace Ventura: Pet Detective,4
9616,Ace Ventura: Pet Detective,1
9617,Ace Ventura: Pet Detective,3
9618,Ace Ventura: Pet Detective,4
9619,Ace Ventura: Pet Detective,3
9620,Ace Ventura: Pet Detective,1
9621,Ace Ventura: Pet Detective,2
9622,Ace Ventura: Pet Detective,3
9623,Ace Ventura: Pet Detective,5
9624,Ace Ventura: Pet Detective,2
9625,Ace Ventura: Pet Detective,2
9626,Ace Ventura: Pet Detective,4
9627,Ace Ventura: Pet Detective,3
9628,Ace Ventura: Pet Detective,1
4

2 回答 2

1

给定您作为多行字符串的输入(可能是文件),如下所示:

st='''9605,Ace Ventura: Pet Detective,5
9606,Ace Ventura: Pet Detective,1
9607,Ace Ventura: Pet Detective,4
9608,Ace Ventura: Pet Detective,3
9609,Ace Ventura: Pet Detective,2
9610,Ace Ventura: Pet Detective,4
9611,Ace Ventura: Pet Detective,3
9612,Ace Ventura: Pet Detective,4
9613,Ace Ventura: Pet Detective,5
9614,Ace Ventura: Pet Detective,5
9615,Ace Ventura: Pet Detective,4
9616,Ace Ventura: Pet Detective,1
9617,Ace Ventura: Pet Detective,3
9618,Ace Ventura: Pet Detective,4
9619,Ace Ventura: Pet Detective,3
9620,Ace Ventura: Pet Detective,1
9621,Ace Ventura: Pet Detective,2
9622,Ace Ventura: Pet Detective,3
9623,Ace Ventura: Pet Detective,5
9624,Ace Ventura: Pet Detective,2
9625,Ace Ventura: Pet Detective,2
9626,Ace Ventura: Pet Detective,4
9627,Ace Ventura: Pet Detective,3
9628,Ace Ventura: Pet Detective,1'''

这有效:

import re

for line in st.splitlines():
    m=re.search(r'(^.*,5$)',line)
    if m: print m.group(0) 

re.findall版本:

print re.findall(r'(^.*,5$)',st, re.MULTILINE)

或(恕我直言有点令人困惑) re.findall 将在没有括号的情况下工作:

print re.findall(r'^.*,5$',st, re.MULTILINE)

你的不工作,因为没有.*意义'匹配所有东西',5 $'

同样如其中一条评论所述,file用作标识符是一个坏主意。

您还可以使用 Python 的字符串处理来执行此操作:

for line in st.splitlines():
    if line.endswith(',5'): print line

如果你真的有一个 CSV 文件要处理——使用内置的 CSV 模块。


最后——如果你在 *nix 上有一个 DOS 文件,只需使用 Python 的通用行支持,在其中使用带有 'U'的 open:

with open(...,'rU') as infile:
于 2013-02-07T14:56:45.227 回答
1

请注意,您在这里并不需要正则表达式:

with open('file') as f:
    lines = [l.strip() for l in f.readlines() if l.strip().endswith(',5')]

print(list(lines))
>>> ['9605,Ace Ventura: Pet Detective,5', '9613,Ace Ventura: Pet Detective,5', '9614,Ace Ventura: Pet Detective,5', '9623,Ace Ventura: Pet Detective,5']
于 2013-02-07T15:02:58.083 回答