我正在写一个python MapReduce字数统计程序。问题是数据中有很多非字母字符,我发现了这个帖子Stripping everything but alphanumeric chars from a string in Python,它展示了一个使用regex的很好的解决方案,但我不知道如何实现它
def mapfn(k, v):
print v
import re, string
pattern = re.compile('[\W_]+')
v = pattern.match(v)
print v
for w in v.split():
yield w, 1
恐怕我不知道如何使用re
库,甚至regex,我不知道如何正确地将regex模式应用于传入的字符串(书中的行)v
,以检索不包含任何非字母数字字符的新行。
有什么建议?
7条答案
按热度按时间im9ewurl1#
使用
re.sub
或者,如果您只想删除某一组字符(作为撇号可能可以在您的输入中...)
nfg76nw02#
如果不想使用regex,可以尝试
px9o7tmv3#
您可以使用re.sub()函数移除这些字符:
re.sub(匹配模式、替换字符串、要搜索的字符串)
"[^a-zA-Z]+"
-查找不是a-zA-z的任意字符组。""
-将匹配的字符替换为“”7xllpg7q4#
试试看:
这将从字符串中取出每个字符,只保留字母数字字符,并从它们构建一个字符串。
qaxu7uf25#
最快的方法是regex
lmyy7pcs6#
如果你打算匹配特定的Unicode属性类,建议使用PyPi
regex
module。这个库也被证明是更稳定的,特别是处理大文本,并且在不同的Python版本中产生一致的结果。你所需要做的就是保持它的最新。如果安装它(使用
pip install regex
或pip3 install regex
),则可以使用从
text
中移除除Unicode字母以外的所有1个或多个字符的块。请参见Python在线演示。您也可以使用"".join(regex.findall(r'\p{L}+', 'ABCŁąć1-2!Абв3§4“5def”'))
来获得相同的结果。在Python
re
中,为了匹配任何Unicode字母,可以使用[^\W\d_]
构造(Match any unicode letter?)。因此,要删除所有非字母字符,您可以匹配所有字母并连接结果:
或者,删除与
[\W\d_]
模式(与[^\W\d_]
相反)匹配的所有字符:\w
匹配的字符集将取决于Python版本。强烈建议使用PyPiregex
库来获得一致的结果。5m1hhzi47#
下面是另一个可调用函数,它可以删除所有不符合普通英语的内容:
用法: