python - 用于多个和单个点的 Python 正则表达式
问题描述
我目前正在尝试清理 1-gram 文件。部分词语如下:
word
- 基本词,经典案例word.
- 基本单词,但带有一个点w.s.f.w.
- (单词代表单词)- 正确的首字母缩写词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
.
我正在寻找一个正则表达式(最好是一个而不是当前使用的两个):
给定
word
回报word
给定
word.
回报word
给定
w.s.f.w.
回报w.s.f.w.
给定
w.s.f.w
回报w.s.f.w.
给定
m.in
回报m.in.
解决方案
正则表达式永远不会返回不存在的内容,因此您可以忘记要求 5。您可以做的是始终删除最后一个句点,如果结果包含嵌入的句点,则将其添加回来。这将为您提供所需的结果,而且非常简单:
found = re.findall(r"\w+(?:\.\w+)*", input_word)[0]
if "." in found:
found += "."
如您所见,我匹配一个单词加上任意数量的“.part”后缀。与您的版本一样,这不仅匹配单字母首字母缩写词,还匹配更长的缩写词,如 Ph.D.、Prof.Dr. 或其他。
推荐阅读
- sql - Django 中的多个数据库 - MSSQL
- bukkit - 持久数据容器未保存到块
- python - Pandas, read_sql() - 从 SQL Server 读取
- android - Flutter image_picker 插件在从图库中选择图像时使应用程序崩溃(仅在特定设备上)
- php - PHPSpreadsheet 错误地读取某些日期
- .net - DOt 网络定义
- azure - Azure Function App 2.0 无法正确部署
- string - 在 Kotlin 中检查字符串是否仅包含英文字母、数字、下划线、点(如 Instagram 用户名)
- javascript - 在另一个模态滚动问题上引导模态
- excel - Application.ScreenUpdating = False 不起作用。是否有可能在我的代码或 MS365 问题的某个地方打开它?