Python从没有regex的段落的引号中提取单词

2024-09-28 01:23:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我从.txt文件中输入以下段落:

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

这是一个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()之后,我觉得我可以跟踪引用。你知道吗

with open(input_file, "r") as read_file:
     for line in read_file:
          quotes = ['"' + i + '"' for i in line.split('"') if i]

Tags: in列表splitipsumdolorametsitdiam
3条回答

以下是两种可能的方法:

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)

第一个是关于文本是如何被理解的更明确一点 “parsed”,而第二个可能是更华丽的一行分裂为基础的 你要找的方法。你知道吗

我试过这个:

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'] 

相关问题 更多 >

    热门问题