Regex筛选列表中的项,使其只包含不包含az字符的项

2024-10-03 02:48:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试过太多的regex组合,以至于我不确定问题是我的regex还是python编码(这两者都是相当新的)。在

我有一个list,叫做inputs

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

我想以一个list结尾,它只包含那些确实中有非字母字符(未知)的项。在

所以我想找到:

^{pr2}$

没有所有的项目[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()

我尝试过过滤或保留regex(我尝试过很多不同的方法,包括使用以下内容的不同代码:

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

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

'.*[^abcdefghijklmnopqrstuvwxyz]*.*'

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

'[\w]*'

另一件不应该发生的事情是myset.add()似乎正在生成一个空集,但是出于某种奇怪的原因,inputs_filtered正在被填充……我想。在


Tags: 代码alpharemagicfilteredlistregexmonkey
3条回答

您可以将re.findall\W一起使用:

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

输出:

^{pr2}$

由于在示例中使用的是set,结果的顺序似乎并不重要。 你可以用两种方法轻松做到这一点。一个有正则表达式,另一个没有正则表达式(如果不需要,为什么还要用正则表达式呢)。在

对于regex,您只需要一个简单的regex [^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。可以使用以下代码构建集合:

^{pr2}$

如果包含来自itertoolsfilterfalse函数(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))

如果您希望排除其他一些字符,可以使用regex或使用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))

[^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']

相关问题 更多 >