0

假设这alphabet是一个字符列表。我想从不属于的字符串中删除所有字符alphabet。因此,如何匹配所有这些字符?

编辑:alphabet可以有任何字符,而不是必需的字母。

编辑2:只是好奇,可以用正则表达式吗?

4

5 回答 5

1

使用字符串库。这里我使用 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)
于 2013-10-31T23:40:30.963 回答
1

你实际上不需要正则表达式。所有你需要的是:

# "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'
>>>
于 2013-10-31T23:41:45.130 回答
0

如果您想使用正则表达式:

使用这个正则表达式:[^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 + " ")])

于 2013-10-31T23:40:06.970 回答
0

而不是正则表达式,这是一个使用的解决方案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在函数之外构造(并且只构造一次)以提高效率。

于 2013-10-31T23:42:14.883 回答
-1

查看 re.sub,并使用否定字符类,如 '[^ad] ' 或 '[^abcd] '。 http://docs.python.org/2.7/library/re.html

于 2013-10-31T23:43:46.730 回答