Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
文件读取和regex-Python_Python_Regex_String_File - Fatal编程技术网

文件读取和regex-Python

文件读取和regex-Python,python,regex,string,file,Python,Regex,String,File,我读了一个文件,其中有一行:Fixes:Saurabh喜欢python 我想删除上述行的修复:部分。我为此雇用了regex 但是下面的代码段返回的输出如下 Saurabh Likes python\r 我想知道\r来自哪里。我尝试了所有的剥离选项来删除它,比如rstrip(),lstrip(),等等,但都没有效果。谁能告诉我摆脱\r的方法吗 patternFixes ='\s*'+'Fixes'+':'+'\s*' matchFixes= re.search(patternFixes,line

我读了一个文件,其中有一行:
Fixes:Saurabh喜欢python

我想删除上述行的
修复:
部分。我为此雇用了regex 但是下面的代码段返回的输出如下

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

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

改用
open(filename)
。现在,Python将自动将所有换行符规范化为
\n
,而不考虑当前平台

另外,为什么不简单地
patternFixes=r'\s*修复:\s*'
?为什么所有的
+
es

然后,你做了很多不必要的事情,比如一遍又一遍地重新编译正则表达式

因此,我的建议(与您的代码做相同的事情(加上文件处理):

没有“\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
>>> 

清除
\r
的建议:

我想您已经使用
open(filename)
打开了您的文件

如果省略模式,则除了 标准的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
是否在输出中消失


当然,您的代码看起来相当笨拙,但其他人已经对这一部分进行了评论。

该'\r'是一个回车-,正在从您的文件中提取

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

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

保存了所有正则表达式的内容。但性能不确定。这应该会同时杀死你的“\r”。

这是因为问题发生在他发布代码之前。请参阅我的答案。是的,可能是这样。我正试图鼓励OP发布更多代码和详细信息。采用你的方式会像Saurabh喜欢python一样给我输出\“\r”没有完全获得..而只是r wentAh-如果它将“\r”读取为两个字符,则以倒数第二个字符结尾将达到所需的结果。我没有以二进制模式打开文件。我删除了+es,但看到了相同的输出
with open(filename, "rU") as f:
    # do your stuff here.
    ...
line = line[line.find('Fixes: ')+7:-1]