regex Python,从字符串中移除所有非字母字符

ruarlubt  于 2022-12-14  发布在  Python
关注(0)|答案(7)|浏览(185)

我正在写一个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,以检索不包含任何非字母数字字符的新行。
有什么建议?

im9ewurl

im9ewurl1#

使用re.sub

import re

regex = re.compile('[^a-zA-Z]')
#First parameter is the replacement, second parameter is your input string
regex.sub('', 'ab3d*E')
#Out: 'abdE'

或者,如果您只想删除某一组字符(作为撇号可能可以在您的输入中...)

regex = re.compile('[,\.!?]') #etc.
nfg76nw0

nfg76nw02#

如果不想使用regex,可以尝试

''.join([i for i in s if i.isalpha()])
px9o7tmv

px9o7tmv3#

您可以使用re.sub()函数移除这些字符:

>>> import re
>>> re.sub("[^a-zA-Z]+", "", "ABC12abc345def")
'ABCabcdef'

re.sub(匹配模式、替换字符串、要搜索的字符串)

  • "[^a-zA-Z]+"-查找不是a-zA-z的任意字符组。
  • ""-将匹配的字符替换为“”
7xllpg7q

7xllpg7q4#

试试看:

s = ''.join(filter(str.isalnum, s))

这将从字符串中取出每个字符,只保留字母数字字符,并从它们构建一个字符串。

qaxu7uf2

qaxu7uf25#

最快的方法是regex

#Try with regex first
t0 = timeit.timeit("""
s = r2.sub('', st)

""", setup = """
import re
r2 = re.compile(r'[^a-zA-Z0-9]', re.MULTILINE)
st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+'
""", number = 1000000)
print(t0)

#Try with join method on filter
t0 = timeit.timeit("""
s = ''.join(filter(str.isalnum, st))

""", setup = """
st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+'
""",
number = 1000000)
print(t0)

#Try with only join
t0 = timeit.timeit("""
s = ''.join(c for c in st if c.isalnum())

""", setup = """
st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+'
""", number = 1000000)
print(t0)

2.6002226710006653 Method 1 Regex
5.739747313000407 Method 2 Filter + Join
6.540099570000166 Method 3 Join
lmyy7pcs

lmyy7pcs6#

如果你打算匹配特定的Unicode属性类,建议使用PyPi regex module。这个库也被证明是更稳定的,特别是处理大文本,并且在不同的Python版本中产生一致的结果。你所需要做的就是保持它的最新。
如果安装它(使用pip install regexpip3 install regex),则可以使用

import regex
print ( regex.sub(r'\P{L}+', '', 'ABCŁąć1-2!Абв3§4“5def”') )
// => ABCŁąćАбвdef

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?)。
因此,要删除所有非字母字符,您可以匹配所有字母并连接结果:

result = "".join(re.findall(r'[^\W\d_]', text))

或者,删除与[\W\d_]模式(与[^\W\d_]相反)匹配的所有字符:

result = re.sub(r'[\W\d_]+', '', text)
    • 然而**,在不同的Python版本中,你可能会得到不一致的结果,因为Unicode标准正在发展,与\w匹配的字符集将取决于Python版本。强烈建议使用PyPi regex库来获得一致的结果。
5m1hhzi4

5m1hhzi47#

下面是另一个可调用函数,它可以删除所有不符合普通英语的内容:

import re
remove_non_english = lambda s: re.sub(r'[^a-zA-Z\s\n\.]', ' ', s)

用法:

remove_non_english('a€bñcá`` something. 2323')
> 'a b c    something     '

相关问题