我有一大组真实世界的文本,需要从中提取单词才能输入到拼写检查器中。我想提取尽可能多的有意义的单词,不要太吵。我知道这里有很多雷鬼忍者,所以希望有人能帮我。
目前我正在用'[a-z]+'
提取所有字母序列。这是一个很好的近似值,但它会拖出很多垃圾。
理想情况下我希望有一些正则表达式(不一定要漂亮或高效)提取由自然单词分隔符(如[/-_,.: ]
等)分隔的所有字母序列,并忽略任何具有非法边界的字母序列。
不过,我也很高兴能得到所有的字母顺序,不相邻的数字。例如'pie21'
不会提取'pie'
,但是'http://foo.com'
会提取['http', 'foo', 'com']
。
我尝试了lookahead
和lookbehind
断言,但它们是每个字符应用的(例如re.findall('(?<!\d)[a-z]+(?!\d)', 'pie21')
将在我希望它不返回任何内容时返回'pi'
)。我试着把alpha部分包装成一个术语((?:[a-z]+)
),但是没有用。
更多细节:数据是一个电子邮件数据库,因此它大部分是普通英语,带有普通数字,但偶尔有一些垃圾字符串,如GIHQ4NWL0S5SCGBDD40ZXE5IDP13TYNEA
和AC7A21C0
,我想完全忽略。我认为任何有数字的字母顺序都是垃圾。
如果将自己限制为ASCII字母,则使用(与
re.I
选项集一起使用)\b
是一个单词边界锚,只在字母数字“单词”的开头和结尾匹配。所以\b[a-z]+\b
匹配pie
,而不是pie21
或21pie
。要同时允许使用其他非ASCII字母,可以使用以下内容:
它还允许重音字符等。您可能需要设置
re.UNICODE
选项,特别是在使用Python 2时,以便\w
速记与非ASCII字母匹配。[^\W\d_]
作为否定字符类,除了数字和下划线之外,允许任何字母数字字符。怎么办:
注意:
编辑:添加了一些解释
你熟悉word boundaries?(
\b
)吗。您可以使用序列周围的\b
来提取单词,并在以下范围内匹配字母表:例如,这将获取整个单词,但在连字符、句点、分号等标记处停止
您可以在python manual上的
\b
序列和其他序列编辑此外,如果要查找匹配后或匹配前的某个数字,则可以使用负数向前/向后:
相关问题 更多 >
编程相关推荐