正则表达式过滤列表中的项目,只包含那些包含非 a-z 字符的项目
Regex filter items in list to have only those items which DO contain a character that isn't a-z
我尝试了很多正则表达式组合,所以我不确定问题是出在我的正则表达式还是我的 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
正在被填充......我认为。
您可以将 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']
您在 [^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']
由于您在示例中使用了 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
class 上有一个名为 isalpha
的函数,如果您的字符串只有字母字符,则 returns 为真。您可以使用以下代码构建您的集合:
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))
您也可以尝试不使用正则表达式的方法:
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']
我尝试了很多正则表达式组合,所以我不确定问题是出在我的正则表达式还是我的 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
正在被填充......我认为。
您可以将 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']
您在 [^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']
由于您在示例中使用了 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
class 上有一个名为 isalpha
的函数,如果您的字符串只有字母字符,则 returns 为真。您可以使用以下代码构建您的集合:
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))
您也可以尝试不使用正则表达式的方法:
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']