python中关于各种正则表达式和列表长度的条件语句

python中关于各种正则表达式和列表长度的条件语句,python,regex,list,maxlength,Python,Regex,List,Maxlength,我有以下清单: ['E12.2', 'E16.1', 'E15.1'] ['E10.1', 'I11.2', 'I10.1_27353757'] ['E16.1', 'E18.1', 'E17.3'] ['E1.8', 'I12.1_111682336', 'I12.1_111682195'] ['E55.1', 'E57.1', 'E56.1','E88.1'] ['U22.3', 'U22.6_13735517', 'U23.1'] 我想提出一个条件,过滤掉那些a)

我有以下清单:

  ['E12.2', 'E16.1', 'E15.1']
  ['E10.1', 'I11.2', 'I10.1_27353757']
  ['E16.1', 'E18.1', 'E17.3']
  ['E1.8', 'I12.1_111682336', 'I12.1_111682195']
  ['E55.1', 'E57.1', 'E56.1','E88.1']
  ['U22.3', 'U22.6_13735517', 'U23.1']
我想提出一个条件,过滤掉那些a)长度等于3 b)不包含“U”c)不包含字母“U”的列表 我试图在一行中实现,我该怎么做?我有以下条件工作,我知道你可以使用正则表达式模块匹配列表中的正则表达式,但我可以在一行中完成所有条件吗

 if(len(fin_list) == 3) 

这是一种可能的方法:

lists = [['E12.2', 'E16.1', 'E15.1'],
         ['E10.1', 'I11.2', 'I10.1_27353757'],
         ['E16.1', 'E18.1', 'E17.3'],
         ['E1.8', 'I12.1_111682336', 'I12.1_111682195'],
         ['E55.1', 'E57.1', 'E56.1','E88.1'],
         ['U22.3', 'U22.6_13735517', 'U23.1']]

for lst in lists:
    if len(lst) != 3 and not any('_' in item or 'U' in item for item in lst):
        print(lst)

# Output:
# ['E55.1', 'E57.1', 'E56.1', 'E88.1']
这里有趣的一点是在生成器表达式上使用
any
。要分解它,这将迭代
lst
中的每个
,并应用测试以查看
\uu
U
是否在其中。该列表理解会导致列表中每个项目的
True
/
False
any
然后查找第一个
True
。如果找到一个,它会立即返回
True
。如果没有找到,则返回
False

编辑

好的,我们已经清楚地进入了“仅仅因为你可以并不意味着你应该”的领域,但这里有一个解决方案,它包含了评论中引入的新条件:

from collections import Counter
import re

lists = [['E12.2', 'E16.1', 'E15.1'],
         ['E10.1', 'I11.2', 'I10.1_27353757'],
         ['E16.1', 'E18.1', 'E17.3'],
         ['E1.8', 'I12.1_111682336', 'I12.1_111682195'],
         ['E55.1', 'E57.1', 'E56.1','E88.1'],
         ['U22.3', 'U22.6_13735517', 'U23.1'],
         ['E7.2', 'E9.5', 'E9.3']]

for lst in lists:
    if (len(lst) != 3 and not any('_' in item or 'U' in item for item in lst) and
            (Counter(match.groups(1) for match in [re.match(r'E(\d+)\.', item) for item in lst] if match is not None)
             .most_common(1) or [(None, 1)])[0][1] == 1):
        print(lst)

# Output:
# ['E55.1', 'E57.1', 'E56.1', 'E88.1']
Counter
计数,
re.match
尝试查找
E
s之后的数字,
最常见的(1)或[(无,1)]
是确保即使没有匹配的元素,我们仍然可以索引到结果中并查找最大的出现次数

虽然前面的代码还可以,但现在这是一个糟糕的代码,应该移到另一个函数中。:-)

一个班轮:

ls= [['E12.2', 'E16.1', 'E15.1'],
  ['E10.1', 'I11.2', 'I10.1_27353757'],
  ['E16.1', 'E18.1', 'E17.3'],
  ['E1.8', 'I12.1_111682336', 'I12.1_111682195'],
  ['E55.1', 'E57.1', 'E56.1','E88.1'],
  ['U22.3', 'U22.6_13735517', 'U23.1']]

print(list(filter(lambda l : not any(('_' in x or 'U' in x) for x in l),filter(lambda l : len(l)!=3,ls))))
结果:

[['E55.1', 'E57.1', 'E56.1', 'E88.1']]
我承认这很复杂,但符合规格,因为它是一个单衬里:

  • 外部筛选条件为:否定(下划线或U不包含在列表的任何元素中)
  • 内部过滤器条件:列表长度!=3.最好从这开始,以避免对元素进行不必要的处理

为了好玩,生成器表达式也可以替换为
map(set('U')。intersection,l)
hi smarx,alex我有另一行,列表为['E7.2'、'E9.5'、'E9.3'],我想设置另一个条件,即我不希望E之后的任何内容具有相同的数字(在这种情况下,这两种情况下都是E9),如何删除这些行?我能想到的一件事是拆分,如果有一种方法可以将所有内容都包含在同一行中。为此,E9.3与E9.5相同,但据推测(从前面的示例中),E55.1与E56.1不同。是这样吗?(您是否将其解释为一个E后跟一个十进制数,并忽略小数点后的所有内容?)嗨,smarx,我想删除所有列表,即E之后的所有常见内容,无论是E9还是E55,因此将删除列表['E7.2'、'E9.5'、'E9.3']以及列表['E7.2'、'E55.5'、'E55.3'],不,只有数字相同的,所以E55.1和E56.1会有所不同。我想你想要的就是我说的。例如,E55.5和E56.1都以“E5”开头,但您可以接受。如果所有的数字都在E后面,但在小数点之前匹配,你只想考虑它们“重复”。如果你考虑到这类事情,我认为列表理解更可读。例如,转换我的答案:
[如果len(lst)!=3,则列表中的lst为lst,而不是任何('uu'在项目中或'U'在项目中,对于lst中的项目)]
。这肯定更好,是的<代码>过滤器在您必须将其转换为
列表
时失去了魅力。你应该把这个加到你的答案里。我会的。