【发布时间】:2014-01-08 19:58:31
【问题描述】:
这里有点python/编程新手...
我正在尝试提出一个正则表达式,它可以处理从文本文件中的一行中提取句子,然后将它们附加到列表中。代码:
import re
txt_list = []
with open('sample.txt', 'r') as txt:
patt = r'.*}[.!?]\s?\n?|.*}.+[.!?]\s?\n?'
read_txt = txt.readlines()
for line in read_txt:
if line == "\n":
txt_list.append("\n")
else:
found = re.findall(patt, line)
for f in found:
txt_list.append(f)
for line in txt_list:
if line == "\n":
print "newline"
else:
print line
根据上述代码的最后 5 行打印输出:
{Hello there|Hello|Howdy} Dr. Munchauson you {gentleman|fine fellow}!
What {will|shall|should} we {eat|have} for lunch? Peas by the {thousand|hundred|1000} said Dr. Munchauson; {that|is} what he said.
newline
I am the {very last|last} sentence for this {instance|example}.
'sample.txt'的内容:
{Hello there|Hello|Howdy} Dr. Munchauson you {gentleman|fine fellow}! What {will|shall|should} we {eat|have} for lunch? Peas by the {thousand|hundred|1000} said Dr. Munchauson; {that|is} what he said.
I am the {very last|last} sentence for this {instance|example}.
我已经玩了几个小时的正则表达式,但我似乎无法破解它。就目前而言,正则表达式在for lunch? 的末尾不匹配。因此这两个句子What {will|shall|should} we {eat|have} for lunch? Peas by the {thousand|hundred|1000} said Dr. Munchauson; {that|is} what he said. 没有分开;这就是我想要的。
正则表达式的一些重要细节:
- 每个句子总是以句号、感叹号或问号结尾
- 每个句子将始终包含至少一对大括号“{}”,其中包含一些单词。也不会有误导性的“。”在每个句子的最后一个括号之后。因此
Dr.将始终位于每个句子中的最后一对大括号之前。这就是为什么我试图围绕使用'}'来建立我的正则表达式。这样我可以避免使用异常方法,为Dr.、Jr.、approx.等语法创建异常。对于我运行此代码的每个文件,我个人确保在任何句子的最后一个“}”之后没有“误导性句点”。
我想要的输出是这样的:
{Hello there|Hello|Howdy} Dr. Munchauson you {gentleman|fine fellow}!
What {will|shall|should} we {eat|have} for lunch?
Peas by the {thousand|hundred|1000} said Dr. Munchauson; {that|is} what he said.
newline
I am the {very last|last} sentence for this {instance|example}.
【问题讨论】:
-
在此“{Hello there|Hello|Howdy} Dr. Munchauson 你{绅士|好人}!”有误导性的“。”这里。第一个句点也在这个“句子”的最后一个括号之后:“{Hello there|Hello|Howdy} Dr.”
-
在那句话中,'!'是句子的结尾,而“!”出现在该句子中的最后一个“}”之后。正如我在 OP 中解释的那样,句子可以以句号、感叹号或问号结尾。