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

2024-05-19 20:54:07 发布

您现在位置: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']]。你知道吗

我怎么办?你知道吗


Tags: langisversionxmltrunknownenseg
3条回答

在过去,我非常喜欢使用Beautifulsoup来完成类似的任务,尽管我只使用html。It does however handle xml quite well also, apparently。你知道吗

具体来说,你可能想看看像.find_all这样的东西。如果您想开始使用这个函数(除了the documentation有多好),最重要的是要意识到find\u all函数的返回值是一个对象,您可以再次调用find\u all on,这样您就可以执行以下操作:

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)

这个模块中的docstring也很好,所以dir(object)和help(object),help(对象.函数)etc一如既往地是你的朋友。你知道吗

我承认,我曾经尝试过用regex解析html(很遥远,但距离不够远,有时我还不会做恶梦),正如第一个答案here - it is a really bad idea中提到的那样。我不知道在xml上使用regex是否不太可能“在这里从sp中提取mor tal man的声音”,但您真的想冒这个风险吗?你知道吗

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

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

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

相关问题 更多 >