我一直在尝试从PDF转换为文本文件中提取某些文本。 PDF来自各种渠道,我不知道它们是如何生成的。
我试图提取的模式只是两个数字,后跟一个连字符,然后是另外两个数字,例如12-34。所以我写了一个简单的正则表达式\d\d-\d\d
并期望它能够工作。
然而,当我测试它时,我发现它错过了一些命中。后来我注意到至少有两个连字符表示为\u2212
和\xad
。所以我把我的正则表达式改为\d\d[-\u2212\xad]\d\d
并且它有效。
我的问题是,因为我要提取这么多PDF,我不知道连字符的其他变体是什么,是否有任何正则表达式覆盖所有"连字符",和希望看起来比[-\u2212\xad]
表达更好?
答案 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]|_)
。