提取整个单词

时间:2011-04-19 14:22:13

标签: python regex word alphabetical text-extraction

我有一大堆真实世界的文字,我需要将文字拉出来输入拼写检查。我想尽可能多地提取有意义的字而不会产生太多噪音。我知道这里有很多正则表达的忍者,所以希望有人可以帮助我。

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

理想情况我想要一些正则表达式(不一定非常有效),它提取由自然单词分隔符(例如[/-_,.: ]等)分隔的所有字母顺序,以及忽略任何带有非法边界的字母序列。

然而,我也很高兴能够获得与数字不相邻的所有字母序列。因此,例如'pie21'不会提取'pie',但'http://foo.com'会提取['http', 'foo', 'com']

我尝试了lookaheadlookbehind断言,但是它们是按字符应用的(例如re.findall('(?<!\d)[a-z]+(?!\d)', 'pie21')当我希望它不返回时,'pi'会返回(?:[a-z]+)。我尝试将alpha部分包装为术语(GIHQ4NWL0S5SCGBDD40ZXE5IDP13TYNEA),但它没有帮助。

更详细信息:这些数据是一个电子邮件数据库,所以它通常是普通数字的普通英语,但偶尔会出现AC7A21C0和{{1}}之类的垃圾字符串。喜欢完全忽略。我假设任何按字母顺序排列的数字都是垃圾。

4 个答案:

答案 0 :(得分:17)

如果您将自己限制为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_]作为否定字符类允许除数字和下划线之外的任何字母数字字符。

答案 1 :(得分:3)

您熟悉word boundaries?\b)吗?您可以使用序列周围的\b提取单词并匹配其中的字母:

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

例如,这将抓住整个单词,但停止在连字符,如连字符,句号,分号等等。

您可以在python manual

处结束\b序列和其他序列

编辑此外,如果您要查看比赛之后或之前的数字,您可以使用负面预测/后方:

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

答案 2 :(得分:2)

怎么样:

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将你的字符串分解为潜在的候选人=&gt;返回“潜在词汇”列表
  • set make unicity filtering =&gt;转换集合中的列表,从而删除多次出现的条目。此步骤不是强制性的。
  • filter减少候选者的数量:获取列表,将测试函数应用于每个元素,并返回测试后的元素列表。在我们的例子中,测试功能是“匿名”
  • lambda:匿名函数,取一个项目并检查它是否是单词(仅限大写或小写字母)

编辑:添加了一些解释

答案 3 :(得分:0)

示例代码

print re.search(ur'(?u)ривет\b', ur'Привет')
print re.search(ur'(?u)\bривет\b', ur'Привет')

s = ur"abcd ААБВ"
import re
rx1 = re.compile(ur"(?u)АБВ")
rx2 = re.compile(ur"(?u)АБВ\b")
rx3 = re.compile(ur"(?u)\bАБВ\b")
print rx1.findall(s)
print rx2.findall(s)
print rx3.findall(s)