正则表达式过滤列表中的项目只包含那些包含不是a-z的

时间:2018-04-16 21:23:08

标签: python regex alphanumeric

我已经尝试了很多正则表达式组合,我不确定问题是我的正则表达式还是我的python编码(两者都相当新)。

我有list名为inputs

inputs = [':boy', '_144-', '_1445', '_1445', 'alpha', 'monkey', '#sdakm', '.file', '.magic']

我希望最终得到的list只包含中包含非字母字符(未知)的项目。

所以我想找到:

newlist = [':boy', '_144-', '_1445', '#sdakm', '.file', '.magic']

没有全部[a-z]的项目。我还想过滤掉任何重复的匹配(任何类型)。

我的python代码如下:

import os, sys, re, string, codecs, cchardet, chardet

inputs = [':boy', '_144-', '_1445', '_1445', 'alpha', 'monkey', '#sdakm', '.file', '.magic']

regex = re.compile('.*[^abcdefghijklmnopqrstuvwxyz]*.*')
myset = set()
inputs_filtered=[]
for inp in inputs:
    if re.search(i,inp):
        if inp not in myset:
            inputs_filtered.append(inp)
            print('adding' + inp)
            myset.add(inp)
            ofile.write(inp + '\n')
        else:
            print('removing duplicate ' + inp)
    else:
        print("IS ALL LETTERS " + i)
print(myset)
ofile.close()

正则表达式我试图过滤掉或保留(我尝试了很多不同的方法,包括使用以下内容的不同代码:

[filter(lambda i: regex.search(i), inputs)]

'\".*[\W|\.|_|\_|-|\-]*.*\"

'.*[^abcdefghijklmnopqrstuvwxyz]*.*'

'\"[\w]*\",?'

'[\w]*'

另一件事是,myset.add()似乎正在产生一个空集,但由于一些奇怪的原因inputs_filtered正在填充......我想。

4 个答案:

答案 0 :(得分:2)

由于您在示例中使用了set,​​因此结果的顺序似乎无关紧要。 你可以通过两种方式轻松完成。一个是正​​则表达式而另一个没有正则表达式(当你不需要时,为什么还要使用正则表达式。)

使用正则表达式,您只需要一个简单的正则表达式[^a-z]。使用filter,您可以执行以下操作:

# drop the IGNORECASE option if you only want lowercase
pat = re.compile(r'[^a-z]', re.IGNORECASE)

# using the function pat.search as your filter function
results = set(filter(pat.search, inputs))

如果它适合您的情况,名为str的{​​{1}}类上有一个函数,如果您的字符串只有字母字符,则返回true。您可以使用以下代码构建您的集:

isalpha

如果您在results = { word for word in inputs if not word.isalpha() } filterfalse的对位点)中加入itertools函数,则可以执行以下操作:

filter

您可以考虑编写自己的函数以与from itertools import filterfalse results = set(filterfalse(str.isalpha, inputs)) 一起使用。这是一个也排除冒号或空格的函数:

filter

如果您要排除其他一些字符,可以使用正则表达式或使用def has_valid_characters(word): return not (word.isalpha() or ' ' in word or ':' in word) # ... results = set(filter(has_valid_characters, input)) 函数作为过滤函数的一部分:

any

答案 1 :(得分:1)

您可以将re.findall\W

一起使用
inputs = [':boy', '_144-', '_1445', '_1445', 'alpha', 'monkey', '#sdakm', '.file', '.magic']
final_inputs = list(filter(lambda x:re.findall('[\W_]', x), inputs))

输出:

[':boy', '_144-', '_1445', '_1445', '#sdakm', '.file', '.magic']

答案 2 :(得分:1)

*后面有[^abcdefghijklmnopqrstuvwxyz],表示匹配0次或更多次重复。将其更改为+,以便将其与1次或更多次重复匹配。

您可以将[^abcdefghijklmnopqrstuvwxyz]缩写为[^a-z]

>>> regex = re.compile('.*[^a-z]+.*')
>>> list(filter(lambda s: regex.match(s), inputs))
[':boy', '_144-', '_1445', '_1445', '#sdakm', '.file', '.magic']

答案 3 :(得分:0)

您也可以尝试不使用正则表达式方法:

inputs = [':boy', '_144-', '_1445', '_1445', 'alpha', 'monkey', '#sdakm', '.file', '.magic']


import unicodedata
import sys

symbols=[chr(i) for i in range(sys.maxunicode) if unicodedata.category(chr(i)).startswith('P')]


print([j for i in symbols for j in inputs if i in j])

输出:

['#sdakm', '_144-', '.file', '.magic', ':boy', '_144-', '_1445', '_1445']