我有一大堆真实世界的文字,我需要将文字拉出来输入拼写检查。我想尽可能多地提取有意义的字而不会产生太多噪音。我知道这里有很多正则表达的忍者,所以希望有人可以帮助我。
目前,我正在使用'[a-z]+'
提取所有字母顺序。这是一个不错的近似值,但它会拖累掉很多垃圾。
理想情况我想要一些正则表达式(不一定非常有效),它提取由自然单词分隔符(例如[/-_,.: ]
等)分隔的所有字母顺序,以及忽略任何带有非法边界的字母序列。
然而,我也很高兴能够获得与数字不相邻的所有字母序列。因此,例如'pie21'
不会提取'pie'
,但'http://foo.com'
会提取['http', 'foo', 'com']
。
我尝试了lookahead
和lookbehind
断言,但是它们是按字符应用的(例如re.findall('(?<!\d)[a-z]+(?!\d)', 'pie21')
当我希望它不返回时,'pi'
会返回(?:[a-z]+)
。我尝试将alpha部分包装为术语(GIHQ4NWL0S5SCGBDD40ZXE5IDP13TYNEA
),但它没有帮助。
更详细信息:这些数据是一个电子邮件数据库,所以它通常是普通数字的普通英语,但偶尔会出现AC7A21C0
和{{1}}之类的垃圾字符串。喜欢完全忽略。我假设任何按字母顺序排列的数字都是垃圾。
答案 0 :(得分:17)
如果您将自己限制为ASCII字母,请使用(设置re.I
选项)
\b[a-z]+\b
\b
是一个单词边界锚点,仅在字母数字“单词”的开头和结尾处匹配。因此\b[a-z]+\b
匹配pie
,但不匹配pie21
或21pie
。
要同时允许其他非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))])
请注意:
编辑:添加了一些解释
答案 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)