【问题标题】:Grab a keyword and the text between keywords in Python在 Python 中抓取关键字和关键字之间的文本
【发布时间】:2011-09-19 22:06:04
【问题描述】:

首先我想说的是,这个地方对我的帮助超出了我的回报。我想对过去帮助过我的所有人表示感谢:)。

我正在尝试从特定样式消息中分离出一些文本。它的格式如下:

DATA|1|TEXT1|STUFF: some random text|||||
DATA|2|TEXT1|THINGS: some random text and|||||
DATA|3|TEXT1|some more random text and stuff|||||
DATA|4|TEXT1|JUNK: crazy randomness|||||
DATA|5|TEXT1|CRAP: such random stuff I cant believe how random|||||

我的代码如下所示,它结合了在单词之间添加空格并将其添加到名为“TEXT”的字符串,因此它看起来像这样:

STUFF: some random text THINGS: some random text and some more random text and stuff JUNK: crazy randomness CRAP: such random stuff I cant believe how random

我需要这样的格式:

DATA|1|TEXT1|STUFF: |||||
DATA|2|TEXT1|some random text|||||
DATA|3|TEXT1|THINGS: |||||
DATA|4|TEXT1|some random text and|||||
DATA|5|TEXT1|some more random text and stuff|||||
DATA|6|TEXT1|JUNK: |||||
DATA|7|TEXT1|crazy randomness|||||
DATA|8|NEWTEXT|CRAP: |||||
DATA|9|NEWTEXT|such random stuff I cant believe how random|||||

行号很简单,我已经完成了,马车返回。我需要的是抓住“CRAP”并将“TEXT1”部分更改为“NEWTEXT”。

我的代码扫描字符串以查找关键字,然后将它们添加到自己的行中,然后在其下方添加文本,然后在其自己的行中添加下一个关键字等。这是我到目前为止的代码:

#this combines all text to one line and adds to a string
while current_segment.move_next('DATA')
    TEXT = TEXT + " " + current_segment.field(4).value

KEYWORD_LIST  = [STUFF:', THINGS:', JUNK:']
KEYWORD_LIST1 = [CRAP:']

#this splits the words up to search through
TEXT_list = TEXT.split(' ')

#this searches for the first few keywords then stops at the unwanted one
for word in TEXT_list:
    if word in KEYWORD_LIST:
        my_output = my_output + word
    elif word in KEYWORD_LIST1:
        break
    else:
        my_output = my_output + ' ' + word

#this searches for the unwanted keywords leaving the output blank until it reaches the wanted keyword
for word1 in TEXT_list:
    if word1 in KEYWORD_LIST:
        my_output1 = ''
    elif word1 in KEYWORD_LIST1:
        my_output1 = my_output1 + word1 + '\n'
    else:
        my_output1 = my_output1 + ' ' + word1

#my_output is formatted back the way I want deviding up the text into 65 or less character lines

MAX_LENGTH = 65
my_wrapped_output  = wrap(my_output,MAX_LENGTH)
my_wrapped_output1 = wrap(my_output1,MAX_LENGTH)
my_output_list     = my_wrapped_output.split('\n')
my_output_list1    = my_wrapped_output1.split('\n')

for phrase in my_output_list:
     if phrase == "":
          SetID +=1
          output = output + "DATA|" + str(SetID) + "|TEXT| |||||"
     else:
          SetID +=1
          output = output + "DATA|" + str(SetID) + "|TEXT|" + phrase + "|||||"

for phrase2 in my_output_list1:
     if phrase2 == "":
          SetID +=1
          output = output + "DATA|" + str(SetID) + "|NEWTEXT| |||||"
     else:
          SetID +=1
          output = output + "DATA|" + str(SetID) + "|NEWTEXT|" + phrase + "|||||"

#this populates the fields I need
value = output

然后我格式化“my_output”和“my_output1”,并在其中添加单词“NEWTEXT”。这段代码遍历每一行寻找关键字,然后放入该关键字和一个回车。一旦它得到另一个“KEYWORD_LIST1”,它就会停止并删除其余的文本,然后开始下一个循环。我的问题是上面的代码给了我这个:

DATA|1|TEXT1|STUFF: |||||
DATA|2|TEXT1|some random text|||||
DATA|3|TEXT1|THINGS: |||||
DATA|4|TEXT1|some random text and|||||
DATA|5|TEXT1|some more random text and stuff|||||
DATA|6|TEXT1|JUNK: |||||
DATA|7|TEXT1|crazy randomness|||||
DATA|8|NEWTEXT|crazy randomness|||||
DATA|9|NEWTEXT|CRAP: |||||
DATA|10|NEWTEXT|such random stuff I cant believe how random|||||

它从“KEYWORD_LIST1”之前获取文本并将其添加到 NEWTEXT 部分。我知道有一种方法可以从关键字和后面的文本中进行分组,但我不清楚如何实现它。任何帮助将不胜感激。

谢谢。

这是我必须做的才能让它为我工作:

KEYWORD_LIST  = ['STUFF:', 'THINGS:', 'JUNK:']
KEYWORD_LIST1 = ['CRAP:']

def text_to_message(text):
    result=[]
    for word in text.split():
        if word in KEYWORD_LIST or word in KEYWORD_LIST1:
            if result:
            yield ' '.join(result)
            result=[]
            yield word
        else:
            result.append(word)
    if result:
        yield ' '.join(result)

def format_messages(messages):
    title='TEXT1'
    for message in messages:
        if message in KEYWORD_LIST:
            title='TEXT1'
        elif message in KEYWORD_LIST1:
            title='NEWTEXT'
    my_wrapped_output  = wrap(message,MAX_LENGTH)
    my_output_list     = my_wrapped_output.split('\n')
    for line in my_output_list:
        if line = '':
            yield title + '|'
        else:
            yield title + '|' + line

for line in format_messages(text_to_message(TEXT)):
    if line = '':
        SetID +=1
        output = "DATA|" + str(SetID) + "|"
    else:
        SetID +=1
        output = "DATA|" + str(SetID) + "|" + line

#this is needed instead of print(line)
value = output 

【问题讨论】:

  • 按照惯例,ALL_CAPS 和普通大小写不会混合在变量名中。您的TEXT_list 可能更贴切地命名为text_list。只是一个小提示。
  • 我可能会尝试 csv 模块而不是自己做。
  • brc,这一定是从我的 java 编码中泄露出来的,哈哈。我更新了以上内容以提供更多详细信息。
  • @Opy:请显示输入 (TEXT?) 和所需的输出。
  • 对不起,TEXT是所有行合并后的长行数据。 TEXT_list 在代码的“拆分”部分创建。我输入了我的其余代码,这样你就可以看到它最终是如何按照我想要的方式格式化的。我应该从一开始就添加它,但我虽然对我的 if/else 语句进行简单的修复就可以修复它。看来我将不得不使用正则表达式。

标签: python search for-loop keyword


【解决方案1】:
  1. 一般提示:不要尝试像这样增加字符串:

    my_output = my_output + ' ' + word
    

    改为将my_output 设为列表,将word 附加到列表中,然后 然后,在最后,做一个单一的连接:my_output = ' '.join(my_output)。 (例如,请参阅下面的 text_to_message 代码。) 使用连接是the right way to build strings。延迟创建字符串很有用,因为处理子字符串列表比拆分和取消拆分字符串更令人愉快,并且必须在这里和那里添加空格和回车。

  2. 研究generators。它们易于理解,在处理此类文本时可以为您提供很多帮助。


import textwrap

KEYWORD_LIST  = ['STUFF:', 'THINGS:', 'JUNK:']
KEYWORD_LIST1 = ['CRAP:']

def text_to_message(text):
    result=[]
    for word in text.split():
        if word in KEYWORD_LIST or word in KEYWORD_LIST1:
            if result:
                yield ' '.join(result)
                result=[]
            yield word
        else:
            result.append(word)
    if result:
        yield ' '.join(result)

def format_messages(messages):
    title='TEXT1'
    num=1
    for message in messages:
        if message in KEYWORD_LIST:
            title='TEXT1'
        elif message in KEYWORD_LIST1:
            title='NEWTEXT'
        for line in textwrap.wrap(message,width=65):
            yield 'DATA|{n}|{t}|{l}'.format(n=num,t=title,l=line)
            num+=1

TEXT='''STUFF: some random text THINGS: some random text and some more random text and stuff JUNK: crazy randomness CRAP: such random stuff I cant believe how random'''

for line in format_messages(text_to_message(TEXT)):
    print(line)

【讨论】:

  • 我希望我没有遗漏太多细节,但我想我做到了。在我上面列出的代码之前,它需要所有单词并将它们组合在一起,在每个单词之间添加一个空格,所以它实际上是在寻找关键词,然后将关键词添加到自己的行中,然后在下面的文本中寻找下一个关键词。一旦通过上述代码,它就会使用其他代码将其分成不超过 65 个字符的行。所以上面的 TEXT_list 是一行,其中的所有文本都省略了 DATA|1|TEXT1|和尾随的|||||。此外,关键字可能彼此不同。
  • 我在上面编辑了我的帖子以便更清楚。我会查看您发布的内容,因为它看起来会有所帮助:)
  • 我编辑了问题以使其更准确。到目前为止感谢您的帮助:)
  • 好多了,但它不喜欢“yield”这个词。我在所有具有“yield”的行上都遇到语法错误。
  • @Opy:嗯,好吧,你自己的代码使用了一些名为wrap的函数。也许用它代替textwrap.wrap
猜你喜欢
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 2015-10-21
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
相关资源
最近更新 更多