【问题标题】:Searching for all Unicode variation of hyphens in Python在 Python 中搜索连字符的所有 Unicode 变体
【发布时间】:2018-02-24 16:44:05
【问题描述】:

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

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

但是,当我测试它时,我发现它错过了一些命中。后来我注意到至少有两个连字符表示为\u2212\xad。所以我将我的正则表达式更改为\d\d[-\u2212\xad]\d\d,它起作用了。

我的问题是,由于我要提取如此多的 PDF,以至于我不知道还有哪些其他连字符变体,是否有任何正则表达式涵盖所有“连字符”,并且希望看起来比 @987654326 更好@表达式?

【问题讨论】:

  • 不,您必须确定哪些字符算作“连字符”并手动包含它们。此外,U+2212 不是连字符(它是数学减号),U+00AD 也不是(这是一个软“中断”连字符)。
  • @usr2564301 感谢您的评论,但我不想区分它们,只要它们看起来像连字符。我无法控制输入,因为它们是从各种 PDF 文件转换而来的。那么“任何看起来像连字符、减号、破折号、破折号或类似字符的东西”是否有任何正则表达式表示?
  • @KennethL,如果您不介意将连字符与数学减号区分开来,并且只想匹配任何与连字符很相似的东西,为什么不使用@987654330 @ 作为您的正则表达式(这将匹配 unicode 中所有可能的连字符 --- 以及什么不是连字符,但它们可能类似于连字符,具体取决于您的思想开放程度:))
  • @LuisColorado 感谢您对\d\d.\d\d 的建议,但我需要排除12345 之类的模式。感谢您提醒我也可以更改我的要求。

标签: python regex


【解决方案1】:

您在问题标题中要求的解决方案暗示了一种白名单方法,意味着您需要找到您认为类似于连字符的字符。

您可以参考Punctuation, Dash Category,Unicode 类别列出了所有可能的 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]|_)

【讨论】:

  • ... 甚至是类似于连字符的中文符号,或任何类似于连字符的符号,如_ 下划线、= 等号、¬ 逻辑否定或@ 987654333@ 波浪号(嗯,它有点像连字符),对吧?
  • @LuisColorado OP 想要包含在“类似于连字符的字符”列表中的任何内容。
  • 恐怕,我放的任何样本都不在您的列表中(并且在标点破折号类别中,有双连字符 --- 不包括等号数学符号---,并且WAVE DASH ---类似于波浪号,有另一个代码点---)我认为使用\d\d\D\d\d 应该会在达到这一点后得到更好的结果。
  • @LuisColorado 我回答了问题标题中所述的问题。我明白你的意思,但在这种情况下,我不会使用.(如您对问题的评论),因为它可能匹配一个数字,也不会使用\D,因为它可能匹配空格。在这种情况下,\d\d(?:[^\w\s]|_)\d\d 匹配两对数字之间的除空格、字母和数字以外的字符。基本上,(?:[^\w\s]|_) 匹配任何标点和符号。
  • 好吧,评论不是给你的评论,而是给OP的。这里的问题是这个问题是如此模棱两可,以至于很难说明什么应该被视为连字符,主要是用 unicode 术语。 您在搜索它们方面做得很好,但我的评论不适合您。案例我有一个很好的答案,我会写一个,而不仅仅是把 cmets 放在其他答案上。即使在您提出的情况下,像1234-5678 这样的序列也会匹配为34-56(我认为这是不良行为),所以认为这是一个难以回答的问题。
猜你喜欢
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
相关资源
最近更新 更多