假设这alphabet
是一个字符列表。我想从不属于的字符串中删除所有字符alphabet
。因此,如何匹配所有这些字符?
编辑:alphabet
可以有任何字符,而不是必需的字母。
编辑2:只是好奇,可以用正则表达式吗?
使用字符串库。这里我使用 string.ascii_letters,你也可以添加数字。在这种情况下,有效字符是:'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' 加上一些额外的(如果需要):“-_.()”
import string
def valid_name(input):
valid_chars = "-_.() "+string.ascii_letters + string.digits
return ''.join(c for c in input if c in valid_chars)
你实际上不需要正则表达式。所有你需要的是:
# "alphabet" can be any string or list of any characters
alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z']
# "oldstr" is your old string
newstr = ''.join([c for c in oldstr if c not in alphabet])
最后,newstr
将是一个新字符串,其中仅包含oldstr
不在alphabet
. 下面是一个演示:
>>> alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
... 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
... 'u', 'v', 'w', 'x', 'y', 'z']
>>> oldstr = 'abc123'
>>> newstr = ''.join([c for c in oldstr if c not in alphabet])
>>> newstr
'123'
>>>
如果您想使用正则表达式:
使用这个正则表达式:[^a-zA-Z]
这将匹配所有非字母。请注意,这也将匹配空格。为避免这种情况,请改用 [a-zA-Z\s]。
更简单的方法:
您实际上根本不需要正则表达式来执行此操作。只需用可接受的字符创建一个字符串,然后过滤掉字符串中所有不在接受字符中的字符。例如:
import string #allows you to get a string of all letters easily
your_word = "hello123 this is a test!!!"
accepted_characters = string.lowercase + string.uppercase + " " #you need the whitespace at the end so it doesn't remove spaces
new_word = ""
for letter in your_word:
if letter in accepted_characters:
new_word += letter
这会给你“你好这是一个测试”
超短法:
这种方法不是最易读的,但它可以在一行中完成。它与上述方法本质上相同,但使用了列表推导和join
将生成的列表转换为字符串的方法。
''.join([letter for letter in your_word if letter in (string.lowercase + string.uppercase + " ")])
而不是正则表达式,这是一个使用的解决方案str.translate()
:
import string
def delete_chars_not_in_alphabet(s, alphabet=string.letters):
all_chars = string.maketrans('', '')
all_except_alphabet = all_chars.translate(None, alphabet)
return s.translate(None, all_except_alphabet)
例子:
>>> delete_chars_not_in_alphabet('<Hello World!>')
'HelloWorld'
>>> delete_chars_not_in_alphabet('foo bar baz', 'abo ')
'oo ba ba'
请注意,如果您使用相同的字母重复调用它,您应该all_except_alphabet
在函数之外构造(并且只构造一次)以提高效率。
查看 re.sub,并使用否定字符类,如 '[^ad] ' 或 '[^abcd] '。 http://docs.python.org/2.7/library/re.html