在Python中搜索连字符的所有Unicode变体

时间:2018-02-22 09:19:17

标签: python regex

我一直在尝试从PDF转换为文本文件中提取某些文本。 PDF来自各种渠道,我不知道它们是如何生成的。

我试图提取的模式只是两个数字,后跟一个连字符,然后是另外两个数字,例如12-34。所以我写了一个简单的正则表达式\d\d-\d\d并期望它能够工作。

然而,当我测试它时,我发现它错过了一些命中。后来我注意到至少有两个连字符表示为\u2212\xad。所以我把我的正则表达式改为\d\d[-\u2212\xad]\d\d并且它有效。

我的问题是,因为我要提取这么多PDF,我不知道连字符的其他变体是什么,是否有任何正则表达式覆盖所有"连字符",和希望看起来比[-\u2212\xad]表达更好?

1 个答案:

答案 0 :(得分:6)

您在问题标题中提出的解决方案意味着白名单方法,这意味着您需要找到您认为与连字符类似的字符。

您可以参考Punctuation, Dash Category,Unicode cateogry列出了所有可能的Unicode连字符。

您可以使用PyPi regex module并使用\p{Pd}模式匹配任何Unicode连字符。

或者,如果您只能使用re,请使用

[\u002D\u058A\u05BE\u1400\u1806\u2010-\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D]

您可以使用其Unicode名称中包含minus的其他Unicode字符展开此列表,请参阅this list

黑名单方法意味着您不希望匹配两对数字之间的特定字符。如果要匹配任何非空格,可以使用\S。如果您想匹配任何标点符号或符号,请使用(?:[^\w\s]|_)