Python正则表达式问题

标签 python regex

因此,我正在努力提高 Python 的整体水平,但在使用正则表达式的 re 模块时遇到了一些问题。

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

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

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

我在这里做错了什么明显的事情吗?

哦,我使用的是 Ubuntu,文件应该有 DOS 样式的行结尾,但我尝试使用 this post 中的代码转换行尾字符。但它并没有达到目的。

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

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

最佳答案

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

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 的 universal line通过使用 open with 'U' 支持其中:

with open(...,'rU') as infile:

关于Python正则表达式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14754013/

相关文章:

python - Grep 多层可迭代的字符串匹配(Python)

python - 如果不同的变量是 True 或 False Python 3.3,则打印

python - 在 Python 中,in 运算符是如何实现的?它是否使用迭代器的 next() 方法?

python - 找不到 django 静态目录

python 3字典过滤器

java - 什么是用于检测 Java 代码中的 for 循环和 while 循环的正则表达式

javascript - 允许数字或特殊字符的正则表达式

java - <br[^>]*> 正则表达式是什么意思?

c# - 使用正则表达式获取部分匹配值

python - 如何在列表理解中将字典值转换为小写?