gpt4 book ai didi

Python:将字符串中的 "dumb quotation marks"替换为 “curly ones”

转载 作者:太空宇宙 更新时间:2023-11-04 05:27:34 25 4
gpt4 key购买 nike

我有这样一个字符串:

“但是那位先生,”看着达西,“似乎认为这个国家一无是处。”

我想要这个输出:

“但是那位先生,”看着达西,“似乎认为这个国家一无是处。”

同样,愚蠢的单引号应该转换成它们的大括号。 Read about the typographic rules here if you are interested.

我猜这个问题之前已经解决了,但我找不到库或脚本来完成它。 SmartyPants (Perl) 是执行此操作的所有库之母,并且有一个 python port .但它的输出是 HTML 实体: “但是那位先生,” 我只想要一个带有弯引号的普通字符串。有什么想法吗?

更新:

我按照 Padraig Cunningham 的建议解决了它:

  1. 使用 smartypants 进行排版更正
  2. 使用 HTMLParser().unescape 将 HTML 实体转换回 Unicode

如果您的输入文本包含您不希望转换的 HTML 实体,这种方法可能会有问题,但在我的情况下没问题。

更新结束

输入是否可信?

目前只能信任输入。该字符串可以包含一个非闭合双引号:"But be that gentleman, looking at Dary。它还可以包含一个非闭合单引号:'But be that gentleman, looking at Dary。最后,它可以包含一个单引号,表示撇号:Don't go there.

我已经实现了一个试图正确关闭这些丢失的引号的算法,所以这不是问题的一部分。为了完整起见,这里是关闭丢失引号的代码:

quotationMarkDictionary = [{
'start': '"',
'end': '"',
},{
'start': '“',
'end': '”',
},{
'start': '\'',
'end': '\'',
},{
'start': '‘',
'end': '’'
},{
'start': '(',
'end': ')'
},{
'start': '{',
'end': '}'
},{
'start': '[',
'end': ']'
}]

'''If assumedSentence has quotation marks (single, double, …) and the
number of opening quotation marks is larger than the number of closing
quotation marks, append a closing quotation mark at the end of the
sentence. Likewise, add opening quotation marks to the beginning of the
sentence if there are more closing marks than opening marks.'''
for quotationMark in quotationMarkDictionary:
numberOpenings = assumedSentence['sentence'].count(quotationMark['start'])
numberClosings = assumedSentence['sentence'].count(quotationMark['end'])
# Are the opening and closing marks the same? ('Wrong' marks.) Then just make sure there is an even number of them
if quotationMark['start'] is quotationMark['end'] and numberOpenings % 2 is not 0:
# If sentence starts with this quotation mark, put the new one at the end
if assumedSentence['sentence'].startswith(quotationMark['start']):
assumedSentence['sentence'] += quotationMark['end']
else:
assumedSentence['sentence'] = quotationMark['end'] + assumedSentence['sentence']
elif numberOpenings > numberClosings:
assumedSentence['sentence'] += quotationMark['end']
elif numberOpenings < numberClosings:
assumedSentence['sentence'] = quotationMark['start'] + assumedSentence['sentence']

最佳答案

您可以使用 HTMLParser 对从 smartypants 返回的 html 实体进行转义:

In [32]: from HTMLParser import HTMLParser

In [33]: s = "&#x201C;But that gentleman,&#x201D;"

In [34]: print HTMLParser().unescape(s)
“But that gentleman,”
In [35]: HTMLParser().unescape(s)
Out[35]: u'\u201cBut that gentleman,\u201d'

为避免编码错误,您应该在打开文件时使用 io.open 并指定 encoding="the_encoding" 或将字符串解码为 un​​icode:

 In [11]: s
Out[11]: '&#x201C;But that gentleman,&#x201D;\xe2'

In [12]: print HTMLParser().unescape(s.decode("latin-1"))
“But that gentleman,”â

关于Python:将字符串中的 "dumb quotation marks"替换为 “curly ones”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38234488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com