提取整词

2024-06-01 02:44:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一大组真实世界的文本,需要从中提取单词才能输入到拼写检查器中。我想提取尽可能多的有意义的单词,不要太吵。我知道这里有很多雷鬼忍者,所以希望有人能帮我。

目前我正在用'[a-z]+'提取所有字母序列。这是一个很好的近似值,但它会拖出很多垃圾。

理想情况下我希望有一些正则表达式(不一定要漂亮或高效)提取由自然单词分隔符(如[/-_,.: ]等)分隔的所有字母序列,并忽略任何具有非法边界的字母序列。

不过,我也很高兴能得到所有的字母顺序,不相邻的数字。例如'pie21'不会提取'pie',但是'http://foo.com'会提取['http', 'foo', 'com']

我尝试了lookaheadlookbehind断言,但它们是每个字符应用的(例如re.findall('(?<!\d)[a-z]+(?!\d)', 'pie21')将在我希望它不返回任何内容时返回'pi')。我试着把alpha部分包装成一个术语((?:[a-z]+)),但是没有用。

更多细节:数据是一个电子邮件数据库,因此它大部分是普通英语,带有普通数字,但偶尔有一些垃圾字符串,如GIHQ4NWL0S5SCGBDD40ZXE5IDP13TYNEAAC7A21C0,我想完全忽略。我认为任何有数字的字母顺序都是垃圾。


Tags: 文本comhttpfoo顺序字母情况序列
3条回答

如果将自己限制为ASCII字母,则使用(与re.I选项集一起使用)

\b[a-z]+\b

\b是一个单词边界锚,只在字母数字“单词”的开头和结尾匹配。所以\b[a-z]+\b匹配pie,而不是pie2121pie

要同时允许使用其他非ASCII字母,可以使用以下内容:

\b[^\W\d_]+\b

它还允许重音字符等。您可能需要设置re.UNICODE选项,特别是在使用Python 2时,以便\w速记与非ASCII字母匹配。

[^\W\d_]作为否定字符类,除了数字和下划线之外,允许任何字母数字字符。

怎么办:

import re
yourString="pie 42 http://foo.com GIHQ4NWL0S5SCGBDD40ZXE5IDP13TYNEA  pie42"
filter (lambda x:re.match("^[a-zA-Z]+$",x),[x for x in set(re.split("[\s:/,.:]",yourString))])

注意:

  • split将字符串分解为潜在的候选项=>;返回“潜在单词”列表
  • set makes unicity filtering=>;转换set中的列表,从而删除多次出现的条目。此步骤不是必需的。
  • filter减少候选者的数量:获取一个列表,对每个元素应用一个测试函数,并返回测试后元素的列表。在我们的例子中,测试函数是“匿名的”
  • lambda:匿名函数,获取一个项目并检查它是否是一个单词(仅限大写或小写字母)

编辑:添加了一些解释

你熟悉word boundaries?\b)吗。您可以使用序列周围的\b来提取单词,并在以下范围内匹配字母表:

\b([a-zA-Z]+)\b

例如,这将获取整个单词,但在连字符、句点、分号等标记处停止

您可以在python manual上的\b序列和其他序列

编辑此外,如果要查找匹配后或匹配前的某个数字,则可以使用负数向前/向后:

(?!\d)   # negative look-ahead for numbers
(?<!\d)  # negative look-behind for numbers

相关问题 更多 >