Python 从列表列表中删除非字母字符并保持结构

Python 从列表列表中删除非字母字符并保持结构,python,python-2.7,Python,Python 2.7,我正在使用python 2.7。我希望在不修改列表结构的情况下,从列表列表中的每个列表中删除非字母字符 开始列表的示例列表: csvarticles = [['[Beta-blockers]', 'Magic!', '1980', 'Presse medicale'],['Hypertension in the pregnant woman].', '', '2010', 'Medical'],['Arterial hypertension.', '', '1920', 'La Nouvelle

我正在使用python 2.7。我希望在不修改列表结构的情况下,从列表列表中的每个列表中删除非字母字符

开始列表的示例列表:

csvarticles = [['[Beta-blockers]', 'Magic!', '1980', 'Presse medicale'],['Hypertension in the pregnant woman].', '', '2010', 'Medical'],['Arterial hypertension.', '', '1920', 'La Nouvelle']]
print (csvarticles[0])
期望输出:

[['β受体阻滞剂','magic','1980','presse medicale',['孕妇高血压',''2010','medical',['动脉高血压','''1920','la nouvelle']]

代码1:

csvarticles = [[word.lower().split() for word in nodeList] for nodeList in csvarticles]

print (csvarticles[0])
代码1输出:

['[Beta阻滞剂],'Magic!','1980','Presse medicale'] [['[β受体阻滞剂],['magic!'],['1980'],['presse','medicale']

代码2:

csvarticles = [[word.lower().split() for word in nodeList if word.isalpha()] for nodeList in csvarticles]
代码2输出:

[]

代码3:

articleTitle = []
for x, y in enumerate(csvarticles):
    myString = simpleWords(csvarticles[x][0])
    if myString is not '':
        myString = myString.lower()
        myString = re.sub('[\W_]+', ' ', myString, flags=re.UNICODE)
        myList = [word for word in myString.split() if len(word) > 3]
        articleTitle = ' '.join(myList)
代码3输出:

[‘β受体阻滞剂’、‘魔术’、‘1980’、‘presse medicale’、‘高血压孕妇’、‘2010’、‘医学’、‘动脉高血压’、‘1920’、‘nouvelle’]


代码3很接近,但消除了嵌套列表的结构。

使用string.isalnum()方法检查字符串是字母还是数字

演示

csvarticles = [['[Beta-blockers]', 'Magic!', '1980', 'Presse medicale'],['Hypertension in the pregnant woman].', '', '2010', 'Medical'],['Arterial hypertension.', '', '1920', 'La Nouvelle']]
res = []
for i in csvarticles:
    r = []
    for j in i:
        r.append("".join([k for k in j if (k.isalnum() or k.isspace())]).lower())
    res.append(r)
print(res)
输出

[['betablockers', 'magic', '1980', 'presse medicale'], ['hypertension in the pregnant woman', '', '2010', 'medical'], ['arterial hypertension', '', '1920', 'la nouvelle']]

您希望替换非空格或alphanum字符,并对字符串进行修剪/小写。正则表达式对于这些替换非常有效,它与
str.strip
链接在一起

在双列表组件中重新生成嵌套列表:

import re

csvarticles = [['[Beta-blockers]', 'Magic!', '1980', 'Presse medicale'],['Hypertension in the pregnant woman].', '', '2010', 'Medical'],['Arterial hypertension.', '', '1920', 'La Nouvelle']]

result = [[re.sub("[^ \w]"," ",x).strip().lower() for x in y] for y in csvarticles]

print(result)
印刷品:

[['beta blockers', 'magic', '1980', 'presse medicale'], ['hypertension in the pregnant woman', '', '2010', 'medical'], ['arterial hypertension', '', '1920', 'la nouvelle']]

如果您使用的是Python,请将
lower
替换为
casefold
,以处理特殊区域设置字符

如果您希望在一行程序中执行此操作:

输入:

output = [[k.lower() for k in [' '.join(re.findall(r'[^\]\[.!-][A-z0-9]+[^\]\[.!-]', j)) for j in i]] for i in csvarticles]
输出:

[['beta blockers', 'magic', '1980', 'presse  medicale'], ['hypertension  in  the  pregnant  woman', '', '2010', 'medical'], ['arterial  hypertension', '', '1920', 'la  nouvelle']]
正则表达式:

[^\]\[.!-][A-z0-9]+[^\]\[.!-]

您仍然希望包含空白字符串吗?代码不是有效的Python。我投票将此问题作为主题关闭,因为它是一个工作请求。没有显示任何解决问题的尝试。您是否忘记包含列表理解的条件?这太漂亮了,非常有魅力,非常感谢!这真的很接近,但消除了单词之间的空格。对不起,我没有考虑空间。是的,你的解决方案也可以!它比rahlf23提供的一个班轮慢得多,但仍然是一个很好的解决方案。非常感谢。我觉得这本书就在那里,你提交的时间几乎与@rahlf23完全相同。我得到一个错误:AttributeError:'str'对象没有属性'casefold'。如果我删除casefold(),它确实正确地删除了非字母字符,但没有转换成小写。是的,这是python版本的问题。如果casefold不可用,您可以使用lower-insteadAwesome,它工作完美,比以前的解决方案更快!非常感谢你。