Python-从不带正则表达式的段落中的引号中提取单词
我将以下段落作为.txt文件的输入: 。。。Lorem“ipsum dolor sit amet,concetetur adipis elite.”。不必担心。肉质元素“turpi”的“est”,在发酵剂直径中。Morbi rhoncus erat ipsum,欧盟“tristique” 以下是一个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
'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共享的逻辑的感觉,这增加了我对列表理解的理解。我很感激你花时间写这篇文章。没有评论的否决票?我的帮助真的那么糟糕吗?如果是这样,请告诉我原因,以便下次我可以提高。