是否有清单或图书馆包含我们可能经常遇到的所有标点符号?
我通常使用string.punctuation
,但是其中不包含一些标点符号,例如:
>>> "'" in string.punctuation
True
>>> "’" in string.punctuation
False
是否有清单或图书馆包含我们可能经常遇到的所有标点符号?
我通常使用string.punctuation
,但是其中不包含一些标点符号,例如:
>>> "'" in string.punctuation
True
>>> "’" in string.punctuation
False
Answers:
您可以通过以下检查做得更好:
>>> import unicodedata
>>> unicodedata.category("'").startswith("P")
True
>>> unicodedata.category("’").startswith("P")
True
Unicode类别P *专用于标点符号:
连接器(Pc),破折号(Pd),初始报价(Pi),最终报价(Pf),打开(Ps),关闭(Pe),其他(Po)
要准备详尽的集合,然后将其用于快速的成员资格检查,请使用集合理解:
>>> import sys
>>> from unicodedata import category
>>> codepoints = range(sys.maxunicode + 1)
>>> punctuation = {c for i in codepoints if category(c := chr(i)).startswith("P")}
>>> "'" in punctuation
True
>>> "’" in punctuation
True
这里的赋值表达式需要Python 3.8+,与旧版本的Python等效:
chrs = (chr(i) for i in range(sys.maxunicode + 1))
punctuation = set(c for c in chrs if category(c).startswith("P"))
注意其中的其他一些字符string.punctuation
实际上在Unicode类别Symbol中。如果需要,也可以轻松添加它们。
$
),Sk(修饰符,如^
),Sm(数学,如+
或<
),以及So(其他,如©
)。
对于正则表达式(regexp)来说,这似乎是一项不错的工作:
import re
text = re.sub(r"[^\w\s]", "", str(text), flags=re.UNICODE)
在这里,正则表达式匹配除空格或单词字符以外的所有内容。该标志re.UNICODE
用于匹配完整的Unicode字符集。
>>> text="Den som dræber - fanget" >>> re.sub(r"[^\w\s]", "", str(text), flags=re.UNICODE) 'Den som dr\xc3ber fanget'
\xc3
转义是与标点符号剥离无关的表示形式)。
\xc3
不是的正确Unicode编码æ
;如果键入str(text)
,则可以确认为\xc3\xa6
。实际上\xc3
似乎并不是一个完整的代码点。
str
是一个字节字符串。您绝对应该切换到Python 3,因为Unicode是Py2的噩梦。对我来说,str('æ')
显示为'æ'
,并且ascii('æ')
显示为'\xe6'
,这是正确的代码点。b'\xc3\xa6'
是的UTF-8编码'æ'
,但这通常不是您想要使用的。
正如其他答案所指出的那样,执行此操作的方法是通过Unicode属性/类别。可接受的答案通过标准库unicodedata
模块访问此信息,但是根据需要的上下文,使用正则表达式访问此相同的属性信息可能更快或更方便。
但是,标准库re
模块不提供扩展的Unicode支持。为此,您需要在PyPI()上可用的regex
模块pip install regex
:
>>> import regex as re
>>> re.match("\p{Punctuation}", "'")
<regex.Match object; span=(0, 1), match="'">
>>> re.match("\p{Punctuation}", "’")
<regex.Match object; span=(0, 1), match='’'>
此处提供了您可以使用正则表达式搜索的所有各种Unicode属性的概述。除了这些额外的正则表达式功能(已在其PyPI主页上进行了记录)之外,还regex
故意提供与相同的API re
,因此,您应该使用re
的文档来弄清楚如何使用它们。