Python-从不带正则表达式的段落中的引号中提取单词

Python-从不带正则表达式的段落中的引号中提取单词,python,split,strip,Python,Split,Strip,我将以下段落作为.txt文件的输入: 。。。Lorem“ipsum dolor sit amet,concetetur adipis elite.”。不必担心。肉质元素“turpi”的“est”,在发酵剂直径中。Morbi rhoncus erat ipsum,欧盟“tristique” 以下是一个Python字符串: 'Lorem "ipsum dolor sit amet, consectetur adipiscing elit.". Praesent non sem urna. Pelle

我将以下段落作为.txt文件的输入:

。。。Lorem“ipsum dolor sit amet,concetetur adipis elite.”。不必担心。肉质元素“turpi”的“est”,在发酵剂直径中。Morbi rhoncus erat ipsum,欧盟“tristique”

以下是一个Python字符串:

'Lorem "ipsum dolor sit amet, consectetur adipiscing elit.". Praesent non sem urna. Pellentesque elementum "turpi" est, "in fermentum diam auctor aliquam!". Morbi rhoncus erat ipsum, eu "tristique"'
我想创建一个只包含引用短语的列表,并将引用中的单词隔离为一个列表(由空格分隔)

输出:

['ipsum', 'dolor', 'sit', 'amet,', 'consectetur', 'adipiscing', 'elit.', 'turpi'', 'in', 'fermentum', 'diam', 'auctor', 'aliquam!', 'tristique']
我的思考过程是先读入文件,然后用引号将段落分割,但我似乎找不到一种方法让“split()”按我的意愿工作。我觉得这可以通过最少的循环和使用split()作为组织数据的手段来完成,而无需使用re、shlex、csv或其他导入的模块

我甚至想过将分隔符重新添加到列表中,然后“清理”列表。但即使这样,感觉也有点复杂

下面的代码为数组中的每个项添加双引号,这不是我想要的。这是我觉得在使用split()后可以跟踪报价的一种方式


以下是两种可能的方法:

desired = [
    'ipsum', 'dolor', 'sit', 'amet,', 'consectetur', 'adipiscing', 'elit.',
    'turpi\'', 'in', 'fermentum', 'diam', 'auctor', 'aliquam!', 'tristique'
    ]

text = """
Lorem "ipsum dolor sit amet, consectetur adipiscing elit.". Praesent non sem
urna. Pellentesque elementum "turpi'" est, "in fermentum diam auctor aliquam!".
Morbi rhoncus erat ipsum, eu "tristique"
"""

def extract_quoted(text):
    words = []
    next_pos = -1
    while True:
        try:
            pos = text.index('"', next_pos + 1)
        except ValueError:
            break
        try:
            next_pos = text.index('"', pos + 1)
        except ValueError as e:
            raise ValueError("mismatched quotes") from e
        quoted_segment = text[pos + 1:next_pos]
        words.extend(quoted_segment.split())
    return words

def split_only(text):
    return [word for chunk in text.split('"')[1::2] for word in chunk.split()]

if __name__ == "__main__":
    print(extract_quoted(text) == desired)
    print(split_only(text) == desired)
第一个是关于文本是如何被分类的更明确一点 “已解析”,而第二个可能更为华而不实的基于一行分割的方法 您正在寻找的方法。

我尝试了以下方法:

a = """Lorem "ipsum dolor sit amet, consectetur adipiscing elit.". Praesent non sem urna. Pellentesque elementum "turpi'" est, "in fermentum diam auctor aliquam!". Morbi rhoncus erat ipsum, eu "tristique" """
in_quote = 0
res = []
word = ''

for i in a:
    if i == '"':
        in_quote = 1 - in_quote
        if word:
            res+=[word]
            word = ''
    elif in_quote:
        if i == ' ':
            res+=[word]
            word = ''
        else:
            word+=i
print(res)

摘自我的评论:

使用“作为分隔符进行拆分后,您只需提取列表中所有奇数索引元素。然后,正常拆分这些元素(使用空格分隔符),并将列表连接在一起

例如:

text = """Lorem "ipsum dolor sit amet, consectetur adipiscing elit.". Praesent non sem urna. Pellentesque elementum "turpi'" est, "in fermentum diam auctor aliquam!". Morbi rhoncus erat ipsum, eu "tristique" """

text_split_by_quotes = text.split('"')
# get the odd-indexed elements (here's one way to do it):
text_in_quotes = text_split_by_quotes[1::2]
# split each normally (by whitespace) and flatten the list (here's one way to do it):
ans = []
for text in text_in_quotes:
    ans.extend(text.split())
# print answer
print(ans)

>>> ['ipsum', 'dolor', 'sit', 'amet,', 'consectetur', 'adipiscing', 'elit.', "turpi'", 'in', 'fermentum', 'diam', 'auctor', 'aliquam!', 'tristique'] 

检查一下这个逻辑,本质上在分割之后,您可以简单地选择每一秒的索引,因为您的文本中没有双引号

text = 'Lorem "ipsum dolor sit amet, consectetur adipiscing elit.". Praesent non sem urna. Pellentesque elementum "turpi" est, "in fermentum diam auctor aliquam!". Morbi rhoncus erat ipsum, eu "tristique"'
print(text)

split_text = text.split('"')
print(split_text)

new_split_text = [elem for i,elem in enumerate(split_text) if i%2 == 1]
print(new_split_text)
如果您想要一行:

new_split_text = [elem for i,elem in enumerate(text.split('"')) if i%2 == 1]
['ipsum dolor sit amet, consectetur adipiscing elit.', 'turpi', 'in fermentum diam auctor aliquam!', 'tristique']
输出:

new_split_text = [elem for i,elem in enumerate(text.split('"')) if i%2 == 1]
['ipsum dolor sit amet, consectetur adipiscing elit.', 'turpi', 'in fermentum diam auctor aliquam!', 'tristique']

你有什么特别的问题吗?显然,你只是想告诉我们你想做这项繁琐的任务,但不想使用(标准)库来简化。我的意思是,你可以重新发明轮子,但为什么?一旦你使用
作为分隔符进行拆分,您不能简单地提取列表中所有的奇数索引元素吗?然后正常地拆分这些列表,并将它们连接在一起。@KevinWang这就行了!这正是我所需要的!非常感谢。那很聪明。我印象深刻。我怎么给你分数?我假设你必须写一个解决方案?不客气,很高兴我能帮上忙:)我添加了我的建议作为答案,因此你可以接受/投票。我很喜欢你的1行代码,虽然我的python知识是公平的,但它有着与@KevinWang共享的逻辑的感觉,这增加了我对列表理解的理解。我很感激你花时间写这篇文章。没有评论的否决票?我的帮助真的那么糟糕吗?如果是这样,请告诉我原因,以便下次我可以提高。