Python 从列表列表中删除非字母字符并保持结构
我正在使用python 2.7。我希望在不修改列表结构的情况下,从列表列表中的每个列表中删除非字母字符 开始列表的示例列表: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
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,它工作完美,比以前的解决方案更快!非常感谢你。