首页 > 解决方案 > 用于多个和单个点的 Python 正则表达式

问题描述

我目前正在尝试清理 1-gram 文件。部分词语如下:

  1. word- 基本词,经典案例
  2. word.- 基本单词,但带有一个点
  3. w.s.f.w.- (单词代表单词)- 正确的首字母缩写词
  4. w.s.f.w- 不正确的首字母缩写词(缺少最后一个点)

我当前的实现考虑了两个不同的 RegEx,因为我还没有成功地将它们组合在一起。第一个 RegEx 识别基本单词:

find_word_pattern = re.compile(r'[A-Za-z]', flags=re.UNICODE)

第二个用于识别首字母缩略词:

find_acronym_pattern = re.compile(r'([A-Za-z]+(?:\.))', flags=re.UNICODE)

假设我有一个input_word字符序列。输出通过以下方式获得:

"".join(re.findall(pattern, input_word))

然后我根据长度选择要使用的输出:输出越长越好。我的策略适用于案例号。1 其中两种模式返回相同的长度。

案例编号 2 是有问题的,因为我的方法产生word.(带点)但我需要它返回word(不带点)。目前,该案的判决有利于find_acronym_pattern产生更长的序列。

案号 3 按预期工作。

案号 4:find_acronym_pattern错过了它产生的最后一个字符,w.s.f.find_word_pattern产生wsfw.

我正在寻找一个正则表达式(最好是一个而不是当前使用的两个):

  1. 给定word回报word

  2. 给定word.回报word

  3. 给定w.s.f.w.回报w.s.f.w.

  4. 给定w.s.f.w回报w.s.f.w.

  5. 给定m.in回报m.in.

标签: pythonregex

解决方案


正则表达式永远不会返回不存在的内容,因此您可以忘记要求 5。您可以做的是始终删除最后一个句点,如果结果包含嵌入的句点,则将其添加回来。这将为您提供所需的结果,而且非常简单:

found = re.findall(r"\w+(?:\.\w+)*", input_word)[0]
if "." in found:
    found += "."

如您所见,我匹配一个单词加上任意数量的“.part”后缀。与您的版本一样,这不仅匹配单字母首字母缩写词,还匹配更长的缩写词,如 Ph.D.、Prof.Dr. 或其他。


推荐阅读