1

我读了一个有一行的文件:Fixes: Saurabh Likes python

我想删除Fixes:上面一行的部分。我为此使用正则表达式,但下面的代码片段返回输出,如

Saurabh Likes python\r

我想知道从哪里来\r。我尝试了所有删除它的剥离选项,例如rstrip(),lstrip()等。但没有任何效果。任何人都可以建议我摆脱\r.

patternFixes ='\s*'+'Fixes'+':'+'\s*'
matchFixes= re.search(patternFixes,line, re.IGNORECASE)
        if matchFixes:
                    patternCompiled = re.compile(patternFixes)
                    line=patternCompiled.sub("", line)
                    #line=line.lstrip()
                    relevantInfo = relevantInfo+line
                    continue

提前致谢!-Saurabh

4

4 回答 4

0

'\r' 是一个回车 - http://en.wikipedia.org/wiki/Carriage_return,它是从您的文件中提取的。

我会注意到,如果您需要“修复”的所有行实际上都以“修复:”开头,而这就是您想要更改的全部内容,您可以执行以下操作:

line = line[line.find('Fixes: ')+7:-1]

为您节省所有正则表达式的东西。不过,不确定性能。这应该同时杀死你的 '\r's。

于 2012-08-24T22:48:24.443 回答
0

您可能以二进制模式(open(filename, "rb")或类似的方式)打开了文件。如果您正在处理文本文件,请不要这样做。

改为使用open(filename)\n现在,无论当前平台如何,Python 都会自动将所有换行符标准化为。

另外,为什么不简单patternFixes = r'\s*Fixes:\s*'呢?为什么都是+es?

然后,您正在做很多不必要的事情,例如一遍又一遍地重新编译正则表达式。

所以,我的建议(它和你的代码做同样的事情(加上文件处理):

r = re.compile(r'\s*Fixes:\s*')
with open(filename) as infile:
    relevantInfo = "".join(r.sub("", line) for line in infile if "Fixes:" in line)
于 2012-08-24T21:43:40.877 回答
0

建议摆脱\r

我想您已经使用open(filename). 按照打开的手册

如果省略 mode,则默认为 'r'。...除了标准 fopen() 值模式可能是“U”或“rU”。Python 通常是用通用换行支持构建的;提供 'U' 将文件作为文本文件打开,但行可能被以下任何一种终止:Unix 行尾约定 '\n'、Macintosh 约定 '\r' 或 Windows 约定 '\ r\n'。所有这些外部表示都被 Python 程序视为“\n”。

所以,简而言之,请尝试使用打开您的文件'rU'并查看是否\r消失:

with open(filename, "rU") as f:
    # do your stuff here.
    ...

你的\r输出中消失了吗?

当然,您的代码看起来相当笨拙,但其他人已经对此部分发表了评论。

于 2012-08-24T22:33:35.867 回答
0
>>> import re
>>> re.sub('Fixes:\s*', '', 'Fixes: Saurabh Likes python')
'Saurabh Likes python'

没有'\r'

>>> re.sub('\s*'+'Fixes'+':'+'\s*', '', 'Fixes: Saurabh Likes python')
'Saurabh Likes python'

再次没有'\r'

您能否提供有关如何复制的更多详细信息?

编辑它也不能用你的代码重现

>>> line = 'Fixes: Saurabh Likes python'
>>> patternFixes ='\s*'+'Fixes'+':'+'\s*'
>>> matchFixes= re.search(patternFixes,line, re.IGNORECASE)
>>> if matchFixes:
...     patternCompiled = re.compile(patternFixes)
...     line=patternCompiled.sub("", line)
...     print line
...     line=line.lstrip()
...     print line
... 
Saurabh Likes python
Saurabh Likes python
>>> 
于 2012-08-24T21:49:28.890 回答