【问题标题】:python - getting some special characters as a list from a complex text file [closed]python - 从复杂的文本文件中获取一些特殊字符作为列表[关闭]
【发布时间】:2016-12-30 04:55:30
【问题描述】:

我有这样一个字符串:

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

我想把&lt;seg&gt;...&lt;/seg&gt; 之间的句子放到一个类似的列表中;

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

我该如何管理?

【问题讨论】:

  • 字符串是否也有新行,或者您只是为了可读性而格式化了上面的帖子?
  • 是 说,字符串有新行。
  • 这是 xml。使用 xml 解析器。
  • 这实际上是一个 .tmx 文件。如果可以用xml解析,你能写一些提示吗?谢谢:)
  • 它是 XML。看看吧。

标签: python


【解决方案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."

【讨论】:

  • LukeBowl,谢谢你的回答。它有效!但现在还有另一个问题。该文件大约为 5 GB。有没有什么快速的方法可以做到这一点?谢谢,
  • @yusuf Python 字符串搜索效率与拆分在这里讨论stackoverflow.com/questions/6963236/…。 5GB 是一个比较大的文件,根据瓶颈可能会有不同的处理方式
【解决方案2】:

过去我非常喜欢使用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 上使用正则表达式是否不太可能“从这里消灭凡人的声音”——但你真的想冒险吗?

【讨论】:

    【解决方案3】:

    如果您想使用纯正则表达式方法,可以尝试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.']]
    

    【讨论】:

      猜你喜欢
      • 2017-12-22
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 2016-05-16
      • 2017-07-26
      相关资源
      最近更新 更多