在正则表达式中容纳两种类型的引号

时间:2012-03-25 13:16:32

标签: python regex quotes double-quotes

我正在使用正则表达式替换输入字符串中的引号。我的数据包含两种“类型”的引号 -

" and “

两者之间存在非常微妙的差异。目前,我在我的正则表达式中明确提到了这两种类型

\"*\“*

我担心在未来的数据中我可能会得到一个不同的'类型'引用,我的正则表达式可能会失败。有多少种不同类型的报价?有没有办法将这些规范化为一种类型,这样我的正则表达式就不会因为看不见的数据而中断?

修改 -

我的输入数据包含HTML文件,我正在将HTML实体和URL转义为ASCII

escaped_line = HTMLParser.HTMLParser().unescape(urllib.unquote(line.decode('ascii','ignore')))

其中line指定HTML文件中的每一行。我需要“忽略”ASCII,因为我的数据库中的所有文件都没有相同的编码,并且在读取文件之前我不知道编码。

Edit2

我无法使用替换功能。我尝试替换('“',''),但它不会替换其他类型的引号'”'。如果我将它添加到另一个替换函数中,它会抛出非ASCII字符错误。

条件

不允许使用外部库,只能使用本机python库。

3 个答案:

答案 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字符串。