从列表中的字符串中删除违规字符[重复]

Posted

技术标签:

【中文标题】从列表中的字符串中删除违规字符[重复]【英文标题】:Remove offending characters from strings in list [duplicate] 【发布时间】:2013-05-13 01:03:17 【问题描述】:

要解析的样本数据(unicode 字符串列表):

[u'\n', u'1\xa0', u'Some text here.', u'\n', u'1\xa0', u'Some more text here.', 
u'\n', u'1\xa0', u'Some more text here.']

我想从这些字符串中删除\xa0

编辑: 当前方法不起作用:

def remove_from_list(l, x):
  return [li.replace(x, '') for li in l]

remove_from_list(list, u'\xa0')

我仍然得到完全相同的输出。

【问题讨论】:

你试过了吗? 是的,我会展示我的尝试 检查这些,***.com/questions/3939361/…,tutorialspoint.com/python/string_replace.htm 这部分你不知道怎么做?如何将u'1\xa0' 变成u'10'?或者如何对列表中的每个元素做同样的事情? no @abarnert 把它变成 u'1' 【参考方案1】:

每个版本的代码都存在不同的问题。让我们从这个开始:

newli = re.sub(x, '', li)
l[li].replace(newli)

首先,newli已经是你想要的那一行——这就是re.sub 所做的——所以你根本不需要replace。只需分配newli

其次,l[li] 不起作用,因为li 是行的,而不是索引


在这个版本中,它是一个但更微妙的:

li = re.sub(x, '', li)

re.sub 正在返回一个新字符串,而您正在将该字符串分配给 li。但这不会影响列表中的任何内容,它只是说“li 不再引用列表中的当前行,它现在引用这个新字符串”。


替换列表元素的唯一方法是获取索引,以便您可以使用[] 运算符。为此,您需要使用enumerate

所以:

def remove_from_list(l, x):
  for index, li in enumerate(l):
    l[index] = re.sub(x, '', li)
  return l

但实际上,你可能确实想使用str.replace——只是你想使用它而不是re.sub

def remove_from_list(l, x):
  for index, li in enumerate(l):
    l[index] = li.replace(x, '')
  return l

那么你就不用担心如果x是正则表达式中的特殊字符会发生什么。


此外,在 Python 中,您几乎从不想就地修改对象并返回它。修改它并返回None,或者返回对象的新副本。所以,要么:

def remove_from_list(l, x):
  for index, li in enumerate(l):
    newli = li.replace(x, '')
    l[index] = newli

… 或:

def remove_from_list(l, x):
  new_list = []
  for li in l:
    newli = li.replace(x, '')
    new_list.append(newli)
  return new_list

您可以简单地将后者理解为列表理解,如 unutbu 的回答:

def remove_from_list(l, x):
  new_list = [li.replace(x, '') for li in l]
  return new_list

第二个更容易编写(不需要enumerate,有一个方便的快捷方式等)这一事实并非巧合——它通常是你想要的,所以 Python 让它变得简单。


我不知道还有什么方法可以更清楚地说明这一点,但最后一次尝试:

如果您选择返回列表的固定新副本而不是就地修改列表的版本,则不会以任何方式修改您的原始列表。如果要使用修复后的新副本,则必须使用函数的返回值。例如:

>>> def remove_from_list(l, x):
...     new_list = [li.replace(x, '') for li in l]
...     return new_list
>>> a = [u'\n', u'1\xa0']
>>> b = remove_from_list(a, u'\xa0')
>>> a
[u'\n', u'1\xa0']
>>> b
[u'\n', u'1']

实际代码将所有内容转换为 1 字符和 0 字符字符串列表时遇到的问题是,您实际上并没有字符串列表,而是有一个字符串repr 的字符串列表。所以,for li in l 的意思是“对于字符串l 中的每个字符li,而不是for each stringliin the listl`。

【讨论】:

由于某种原因它仍然无法正常工作。我根据你的最后一行使用return [li.replace(x, '') for li in l],但它仍然有这些字符。 我刚刚更新了答案,以显示我根据这个答案做了什么。 这不会在原地修改l,它会返回一个新列表,其中删除了每个字符串中的这些字符。您必须打印该新列表,或将其分配给某物或其他任何东西。 我是,只是没有在我的示例中显示 - 我会更新我的问题给你看。【参考方案2】:

如果您只对 ASCII 字符感兴趣(正如您提到的 characters,但这也恰好适用于发布的示例):

[text.encode('ascii', 'ignore') for text in your_list]

【讨论】:

【参考方案3】:

您可以使用list comprehension 和str.replace:

>>> items
[u'\n',
 u'1\xa0',
 u'Some text here.',
 u'\n',
 u'1\xa0',
 u'Some more text here.',
 u'\n',
 u'1\xa0',
 u'Some more text here.']
>>> [item.replace(u'\xa0', u'') for item in items]
[u'\n',
 u'1',
 u'Some text here.',
 u'\n',
 u'1',
 u'Some more text here.',
 u'\n',
 u'1',
 u'Some more text here.']

【讨论】:

@DanO'Day:什么你想保持这个版本没有的有效字符?这会保留除 \xa0 之外的所有内容,这正是您所要求的。 @DanO'Day:代码没有改变。 @Matthias 我的错,但仍然无法正常工作 “不工作”是什么意思?当你在你的 Python 解释器中运行这个确切的代码时,你会得到 unutbu 显示的不同结果?还是 unutbu 显示的结果在某些方面是错误的?

以上是关于从列表中的字符串中删除违规字符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从包含特定字符的列表中删除元素[重复]

使用正则表达式从python中的列表项中删除子字符串

使用循环从字符数组列表中删除重复项? [复制]

如何从列表中删除一个字符[重复]

从列表中删除空字符串(Spark Dataframe)[重复]

如何在保留顺序的同时删除列表中的重复元素?