s.lstrip()问题的解决方法

时间:2018-09-11 11:28:26

标签: python-3.x strip

我正在读取一个xml文件,其中包含以下类型的行:

<PLAYER_NAME>Andrew Tell</PLAYER_NAME>

我想从文件中提取所有名称,并且尝试了:

name = (line.strip()
        .lstrip('<PLAYER_NAME>')
        .rstrip('</PLAYER_NAME>'))

name = line.strip()
name = name.lstrip('<PLAYER_NAME>')
name = name.rstrip('</PLAYER_NAME>')

这些功能适用于某些名称,但是如果名称以以下任何一个开头:  A,E,L,M,N,R,Y(以及其他一些字符)也将被删除,因此在上面的示例中我得到了“ ndrew Tell”,但William Tell很好。我尚未测试过完整的字母,但我确实知道以B,C,D,H,I,J,S,T,W中任何一个开头的名称都可以正确提取

我不得不求助于丑陋的人

namebits = line.split('>',1)
name = namebits[-1].split('<')[0]

这似乎适用于所有名称。

这是s.lstrip的已知问题,还是我做错了什么?

2 个答案:

答案 0 :(得分:3)

对XML使用XML解析器。其他方法都被破坏了。

幸运的是,Python内置了XML解析器,使用起来很简单。它可能比您当前的代码更容易。

import xml.etree.ElementTree as ET

tree = ET.parse('your_file.xml')

player_name = tree.find('.//PLAYER_NAME')    
print(player_name.text)

读取文件search element,获取文本。无需笨拙的字符串操作。假设此XML文件:

<PLAYER>
    <PLAYER_NAME>Andrew Tell</PLAYER_NAME>
</PLAYER>

输出令人惊讶:

Andrew Tell

答案 1 :(得分:0)

根据docsstrip函数接受一个字符串,并去除该字符串中所有开头/结尾的字符-这意味着该参数实际上是一个字符列表,而不是单个字符串。例如:

>'abababababbbaaabbbcdea'.lstrip('ab')
'cdea'

我认为您的工作解决方案没有真正的问题。有效的解决方案比不可行的解决方案无限地“漂亮”。您可以将库解析器用于正在阅读的任何内容,以获取最先进(最可靠)的解决方案。例如,对于简单的XML解析器,xml随Python一起提供,但请不要忘记阅读顶部的警告。