【问题标题】:File reading and regex - Python文件读取和正则表达式 - Python
【发布时间】:2012-08-24 21:41:29
【问题描述】:

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

我想删除上述行的Fixes: 部分。我正在为此使用正则表达式 但下面的 sn-p 会返回类似

的输出
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

【问题讨论】:

    标签: python regex string file


    【解决方案1】:

    建议摆脱\r

    我想您已经使用open(filename) 打开了您的文件。关注manual的开启:

    如果省略 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 在您的输出中消失了吗?

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

    【讨论】:

      【解决方案2】:

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

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

      另外,为什么不简单地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)
      

      【讨论】:

      • 我没有以二进制模式打开文件
      • 我删除了 +es 但我看到了相同的输出
      【解决方案3】:
      >>> 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'了

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

      EDIt也无法用您的代码重现

      >>> 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
      >>> 
      

      【讨论】:

      • 那是因为问题出现在他发布的代码之前。看我的回答。
      • 是的,可能就是这样。我试图鼓励 OP 发布更多代码和详细信息。
      【解决方案4】:

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

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

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

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

      【讨论】:

      • 采用你的方式给了我像 Saurabh Likes python\ '\r' 这样的输出没有完全.. 而只有 r 去了
      • 啊 - 好吧,如果它将 '\r' 读作两个字符,那么以倒数第二个字符结尾将达到预期的结果。
      猜你喜欢
      • 2013-04-08
      • 1970-01-01
      • 2017-06-12
      • 2013-06-12
      • 2017-01-20
      • 2016-07-25
      • 2018-04-06
      • 2015-11-23
      • 1970-01-01
      相关资源
      最近更新 更多