python - 从复杂的文本文件中获取一些特殊字符作为列表

时间:2016-08-23 11:25:43

标签: python

我有这样一个字符串:

    <?xml version="1.0" encoding="UTF-8" ?>
    <tmx version="1.4">
    <header creationdate="Mon Jan  4 11:56:26 2016"
              srclang="en"
              adminlang="en"
              o-tmf="unknown"
              segtype="sentence"
              creationtool="Uplug"
              creationtoolversion="unknown"
              datatype="PlainText" />
      <body>
        <tu>
          <tuv xml:lang="en"><seg>Ah, this is greasy.</seg></tuv>
          <tuv xml:lang="tr"><seg>Yemek çok yağlıymış.</seg></tuv>
        </tu>
        <tu>
          <tuv xml:lang="en"><seg>I want to eat kimchee.</seg></tuv>
          <tuv xml:lang="tr"><seg>Şimdi biraz kimchi yiyebilirim.</seg></tuv>
        </tu>
        <tu>
          <tuv xml:lang="en"><seg>Is Chae Yoon's coordinator in here?</seg></tuv>
          <tuv xml:lang="tr"><seg>Yune'nin stilisti, içeride misin?</seg></tuv>
        </tu>
        <tu>
          <tuv xml:lang="en"><seg>Excuse me, aren't you Chae Yoon's coordinator? Yes. Me?</seg></tuv>
          <tuv xml:lang="tr"><seg>Sen Yune'nin stilisti değil misin?</seg></tuv>
        </tu>
        <tu>
          <tuv xml:lang="en"><seg>-Chae Yoon is done singing.</seg></tuv>
          <tuv xml:lang="tr"><seg>- Ben mi? - Yune şarkısını bitirdi.</seg></tuv>
        </tu>
..............................................................................

我希望将<seg>...</seg>之间的句子放入类似的列表中

[['sentence1', 'sentence2'], ['sentence3', 'sentence4']]

我该如何管理?

3 个答案:

答案 0 :(得分:1)

如果您想使用纯正则表达式方法,可以尝试使用regex.findall来获取所有匹配项。

虽然不是一个完美的方法,但类似

import re
regex = r'<tuv.*<seg>(.*)</seg>.*\n.*<seg>(.*)</seg></tuv>'

input_string = """
<?xml version="1.0" encoding="UTF-8" ?>
    <tmx version="1.4">
    <header creationdate="Mon Jan  4 11:56:26 2016"
              srclang="en"
              adminlang="en"
              o-tmf="unknown"
              segtype="sentence"
              creationtool="Uplug"
              creationtoolversion="unknown"
              datatype="PlainText" />
      <body>
        <tu>
          <tuv xml:lang="en"><seg>Ah, this is greasy.</seg></tuv>
          <tuv xml:lang="tr"><seg>Yemek çok yağlıymış.</seg></tuv>
        </tu>
        <tu>
          <tuv xml:lang="en"><seg>I want to eat kimchee.</seg></tuv>
          <tuv xml:lang="tr"><seg>Şimdi biraz kimchi yiyebilirim.</seg></tuv>
        </tu>
        <tu>
          <tuv xml:lang="en"><seg>Is Chae Yoon's coordinator in here?</seg></tuv>
          <tuv xml:lang="tr"><seg>Yune'nin stilisti, içeride misin?</seg></tuv>
        </tu>
        <tu>
          <tuv xml:lang="en"><seg>Excuse me, aren't you Chae Yoon's coordinator? Yes. Me?</seg></tuv>
          <tuv xml:lang="tr"><seg>Sen Yune'nin stilisti değil misin?</seg></tuv>
        </tu>
        <tu>
          <tuv xml:lang="en"><seg>-Chae Yoon is done singing.</seg></tuv>
          <tuv xml:lang="tr"><seg>- Ben mi? - Yune şarkısını bitirdi.</seg></tuv>
        </tu>
"""

def main():
    y = []
    for i_tuple in re.findall(regex, input_string):
        # just for the sake that you need a list, otherwise re.findall
        # already returns a list of tuples
        y.append(list(i_tuple))
    print(y)

if __name__ == '__main__':
    main()

在我的结尾打印出以下内容

[['Ah, this is greasy.', 'Yemek çok yağlıymış.'], ['I want to eat kimchee.', 'Şimdi biraz kimchi yiyebilirim.'], ["Is Chae Yoon's coordinator in here?", "Yune'nin stilisti, içeride misin?"], ["Excuse me, aren't you Chae Yoon's coordinator? Yes. Me?", "Sen Yune'nin stilisti değil misin?"], ['-Chae Yoon is done singing.', '- Ben mi? - Yune şarkısını bitirdi.']]

答案 1 :(得分:1)

我非常喜欢使用Beautifulsoup来处理过去的任务,尽管我只使用了html。 It does however handle xml quite well also, apparently

具体来说,您可能希望查看.find_all之类的内容。最重要的是要想实现如果你想用这个运行(除了真的很好the documentation之外),那就是find_all函数的返回值是一个你可以再次调用find_all的对象 - 所以你可以这样做:

soup = BeautifulSoup(text)
retval = []
tus = soup.find_all('tu')
for tu in tus:
    inner = []
    tuvs = tu.find_all('tuv')
    for tuv in tuvs:
        inner.append(tuv.contents[0].text)
    retval.append(inner)

这个模块中的文档字符串也非常好,所以dir(object)和help(object),help(object.function)等一如既往地是你的朋友。

我会承认,我已经尝试使用正则表达式解析html(遥远的,但不够遥远,以至于我有时候仍然没有做出错误的梦)过去 - 正如第一个回答中所提到的here - it is a really bad idea 。我不知道在xml上使用正则表达式是否不太可能“从这里开始摒弃时代人的声音” - 但是你真的想冒这个风险吗?

答案 2 :(得分:1)

找到句子的另一种可能方法是

s = """
<?xml version="1.0" encoding="UTF-8" ?>
    <tmx version="1.4">
    <header creationdate="Mon Jan  4 11:56:26 2016"
              srclang="en"
              adminlang="en"
              o-tmf="unknown"
              segtype="sentence"
              creationtool="Uplug"
              creationtoolversion="unknown"
              datatype="PlainText" />
      <body>
        <tu>
          <tuv xml:lang="en"><seg>Ah, this is greasy.</seg></tuv>
          <tuv xml:lang="tr"><seg>Yemek çok yağlıymış.</seg></tuv>
        </tu>
        <tu>
          <tuv xml:lang="en"><seg>I want to eat kimchee.</seg></tuv>
          <tuv xml:lang="tr"><seg>Şimdi biraz kimchi yiyebilirim.</seg></tuv>
        </tu>
        <tu>
          <tuv xml:lang="en"><seg>Is Chae Yoon's coordinator in here?</seg></tuv>
          <tuv xml:lang="tr"><seg>Yune'nin stilisti, içeride misin?</seg></tuv>
        </tu>
        <tu>
          <tuv xml:lang="en"><seg>Excuse me, aren't you Chae Yoon's coordinator? Yes. Me?</seg></tuv>
          <tuv xml:lang="tr"><seg>Sen Yune'nin stilisti değil misin?</seg></tuv>
        </tu>
        <tu>
          <tuv xml:lang="en"><seg>-Chae Yoon is done singing.</seg></tuv>
          <tuv xml:lang="tr"><seg>- Ben mi? - Yune şarkısını bitirdi.</seg></tuv>
        </tu>
"""

first = "<seg>"
last = "</seg>"
while first in s:
  start = s.index( first ) + len( first )
  end = s.index( last, start )
  print(s[start:end])
  s = s[end:]

返回:

"Ah, this is greasy."
"Yemek çok yağlıymış."
"I want to eat kimchee."
"Şimdi biraz kimchi yiyebilirim."
"Is Chae Yoon's coordinator in here?"
"Yune'nin stilisti, içeride misin?"
"Excuse me, aren't you Chae Yoon's coordinator? Yes. Me?"
"Sen Yune'nin stilisti değil misin?"
"-Chae Yoon is done singing."
"- Ben mi? - Yune şarkısını bitirdi."