这是正则表达式,从单词中排除所有大写但不起作用“
import re
s = 'Wd+ Si# Sd*'
slower=''.join(re.findall('([a-z])[-#]*',s))
print slower
当我查看http://www.regexr.com/时,它工作正常,但在程序中它只提供小写字符。
在上面的例子中,它应该给出输出
d+
,i#
和d*
答案 0 :(得分:3)
您可以使用str.translate
s = 'Wd+ Si# Sd*'
import string
print(s.translate(None,string.uppercase))
d+ i# d*
比正则表达式快一点,比使用join更快:
In [29]: import re
In [30]: s = 'Wd+ Si# Sd*'
In [31]: timeit ''.join(re.findall('[^A-Z]', s))
100000 loops, best of 3: 4.23 µs per loop
In [32]: import string
In [33]: timeit s.translate(None,string.uppercase)
1000000 loops, best of 3: 388 ns per loop
In [38]: timeit ''.join([i for i in s if i not in ascii_uppercase])
100000 loops, best of 3: 2.07 µs per loop
答案 1 :(得分:2)
使用大写字母^
排除所有大写字母[A-Z]
:
>>> import re
>>> s = 'Wd+ Si# Sd*'
>>> ''.join(re.findall('[^A-Z]', s))
'd+ i# d*'
仅使用join
而不是re.search
re.sub
,使用>>> re.sub('[A-Z]', '', s) # No '^' here as we want to find upper-case to replace.
'd+ i# d*'
- 它更简单:
{{1}}
答案 2 :(得分:2)
为什么不用空字符串替换所有[A-Z]
?
In [3]: re.sub('[A-Z]','','Wd+ Si# Sd*')
Out[3]: 'd+ i# d*'
如果您想过滤空格/标签...,只需添加\s
:
In [5]: re.sub('[A-Z\s]','','Wd+ Si# Sd*')
Out[5]: 'd+i#d*'
答案 3 :(得分:1)
这是一个使用生成器表达式而不是正则表达式的解决方案。
>>> from string import ascii_uppercase
>>> s = 'Wd+ Si# Sd*'
>>> uppers = set(ascii_uppercase)
>>> ''.join(i for i in s if i not in uppers)
'd+ i# d*'