我正在使用正则表达式替换输入字符串中的引号。我的数据包含两种“类型”的引号 -
" and “
两者之间存在非常微妙的差异。目前,我在我的正则表达式中明确提到了这两种类型
\"*\“*
我担心在未来的数据中我可能会得到一个不同的'类型'引用,我的正则表达式可能会失败。有多少种不同类型的报价?有没有办法将这些规范化为一种类型,这样我的正则表达式就不会因为看不见的数据而中断?
修改 -
我的输入数据包含HTML文件,我正在将HTML实体和URL转义为ASCII
escaped_line = HTMLParser.HTMLParser().unescape(urllib.unquote(line.decode('ascii','ignore')))
其中line指定HTML文件中的每一行。我需要“忽略”ASCII,因为我的数据库中的所有文件都没有相同的编码,并且在读取文件之前我不知道编码。
Edit2
我无法使用替换功能。我尝试替换('“',''),但它不会替换其他类型的引号'”'。如果我将它添加到另一个替换函数中,它会抛出非ASCII字符错误。
条件
不允许使用外部库,只能使用本机python库。
答案 0 :(得分:3)
我认为Python的正则表达式实现中没有“引号”字符类,因此您必须自己进行匹配。
您可以保留常用引号unicode字符列表(here's a list for a good start)并构建与编程引号匹配的正则表达式部分。
答案 1 :(得分:1)
我只能帮助您解决有关引号的原始问题。事实证明,Unicode为每个字符定义了许多属性,这些属性都可通过Unicode字符数据库获得。 “引号”是这些属性之一。
有多少种不同类型的报价?
29,根据Unicode,见下文。
Unicode标准为我们带来了一个关于Unicode属性的{em>权威文本文件PropList.txt,其中包含一个引号列表。由于Python不support all Unicode properties in regular expressions,因此您目前无法使用\p{QuotationMark}
。但是,创建正则表达式字符类是微不足道的:
// placed on multiple lines for readability, remove spaces
// and then place in your regex in place of the current quotes
[\u0022 \u0027 \u00AB \u00BB
\u2018 \u2019 \u201A \u201B
\u201C \u201D \u201E \u201F
\u2039 \u203A \u300C \u300D
\u300E \u300F \u301D \u301E
\u301F \uFE41 \uFE42 \uFE43
\uFE44 \uFF02 \uFF07 \uFF62
\uFF63]
正如上面指出的“tchrist”,您可以使用支持\p{QuotationMark}
的{{3}}来避免麻烦。
答案 2 :(得分:0)
事实证明,有一种更简单的方法可以做到这一点。只需在你用python编写的正则表达式前面添加文字'u'。
regexp = ru'\"*\“*'
如果要将正则表达式编译/搜索/匹配到字符串,请确保使用re.UNICODE标志。
re.findall(regexp, string, re.UNICODE)
不要忘记包含
#!/usr/bin/python
# -*- coding:utf-8 -*-
在源文件的开头,以确保可以在源文件中写入unicode字符串。