python - 正则表达式过滤列表中的项目,只包含那些包含非 a-z 字符的项目

标签 python regex alphanumeric

我尝试了很多正则表达式组合,所以我不确定问题是出在我的正则表达式还是我的 Python 编码(对两者来说都相当陌生)。

我有一个名为 inputslist:

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

我想以一个列表结束,它只包含那些确实在其中具有非字母字符(未知)的项目。

所以我想找到:

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 正在被填充......我认为。

最佳答案

由于您在示例中使用了 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 类上有一个名为 isalpha 的函数,如果您的字符串只有字母字符,它会返回 true。您可以使用以下代码构建您的集合:

results = { word for word in inputs if not word.isalpha() }

如果您包含 itertools 中的 filterfalse 函数(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 函数作为过滤函数的一部分:

def has_valid_characters_no_regex(word):
    return not (word.isalpha() or
                any(x in word for x in ' :#-'))

pat2 = re.compile('[- :#]')

def has_valid_characters_regex(word):
    return not (word.isalpha() or
                pat2.search(word))

关于python - 正则表达式过滤列表中的项目,只包含那些包含非 a-z 字符的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49866458/

相关文章:

python - python 中 range() 参数的顺序

python - 使用 numpy 的批量张量乘法

php - 查找字符串中反斜杠的出现

java - 尝试理解和重现正则表达式模式

sql - 当键不是数字而是字母数字值时,在循环中选择特定数量的行

python - pykalman 的多元回归?

python - Python 3.6 : Using object instance name for raising errors

java - 将引号中的所有文本放入 ArrayList

java - 如何生成随机字母数字字符串

C 编程中使用正则表达式检查字符串是否全是字母数字