使用python仅选择字符串中的非ascii字符

时间:2016-01-20 18:12:15

标签: python utf-8 ascii

如果我有一个名为mystring的字符串并存储在其中:Ümeå我想将非ascii字符Üå存储在列表中。

下面是我的代码,它几乎正常工作,但列表包含十六进制字符(即\ xc3 \ xa6),而不是正确编码的字符:

try:
   mystring.iloc[i].decode('ascii')
   i+=1
except:
   nonascii_string = str(mystring.iloc[i])
   j=0
   #now we've found the string, isolate the non ascii characters
   for item in str(profile_data_nonascii_string):
      try:
         str(nonascii_string[j].decode('ascii'))
         j+=1
      except:
         # PROBLEM: Need to work out how to encode back to proper UTF8 values
         nonascii_chars_list.append(str(nonascii_string[j]))
         j+=1
      i+=1
      pass

我想我需要做一些事情:

chr(profile_data_nonascii_string[j].encode('utf-8'))

但当然这样做只会选择我的多字节字符的第一个字节(因此会抛出错误)。我相信有一个简单的解决方案......: -

2 个答案:

答案 0 :(得分:2)

以下是我如何将非ASCII字符与字符串中的示例字符串分开:

In [7]: s=u'Ümeå'

In [8]: print s
Ümeå

In [9]: s2 = u''.join(x for x in s if ord(x) > 126)

In [10]: print s2
Üå

或者,如果您更喜欢列表中的答案:

In [15]: s=u'Ümeå'

In [16]: print s
Ümeå

In [17]: s2 = list(x for x in s if ord(x) > 126)

In [18]: print s2[0]
Ü

In [19]: print s2[1]
å

答案 1 :(得分:0)

如果要删除字符,可以创建映射,并从字符串中str.translate创建映射:

In [29]: tbl = dict.fromkeys(range(128), u"")

In [30]: s = u'Ümeå'

In [31]: print(s.translate(tbl))
Üå

在你似乎使用的熊猫中,你可以使用pandas.Series.str.translate

Series.str.translate(table,deletechars = None)

  

通过给定的映射表映射字符串中的所有字符。相当于标准的str.translate()。请注意,可选参数deletechars仅在使用python 2时才有效。对于python 3,应通过table参数指定字符删除。

translate将比str.join更有效率:

In [7]: s = 'Ümeå' * 1000

In [8]: timeit ''.join([x for x in s if ord(x) > 127])
1000 loops, best of 3: 489 µs per loop

In [9]: timeit s.translate(tbl)
1000 loops, best of 3: 289 µs per loop
In [10]: s.translate(tbl) ==  ''.join([x for x in s if ord(x) > 127])
Out[10]: True

对于使用python2的pandas,你需要deletechars和None:

In [2]: import pandas as pd

In [3]: raw_data = {'Name' : pd.Series(['david','åndrëw','calvin'], index=['a', 'b', 'c'])}

In [4]: df = pd.DataFrame(raw_data, columns = ['Name'])

In [5]: delete = "".join(map(chr,range(128)))

In [6]: print df['Name'].str.translate(None, delete)
a      
b    åë
c      
Name: Name, dtype: object

对于使用dict的python3工作正常:

In [9]: import pandas as pd

In [10]: raw_data = {'Name' : pd.Series(['david','åndrëw','calvin'], index=['a', 'b', 'c'])}

In [11]: 

In [11]: df = pd.DataFrame(raw_data, columns = ['Name'])

In [12]: 

In [12]: delete = dict.fromkeys(range(128), "")

In [13]: df['Name'].str.translate(delete)
Out[13]: 
a      
b    åë
c      
Name: Name, dtype: object

记录了所需的不同方法:

参数:

  

table:dict(python 3),str或None(python 2)   在python 3中,table是Unicode序数到Unicode序数,字符串或None的映射。未映射的字符保持不变。映射到“无”的字符将被删除。 str.maketrans()是用于制作转换表的辅助函数。在python 2中,table是长度为256或None的字符串。如果表参数为None,则不应用任何转换,操作只删除deletechars中的字符。 string.maketrans()是用于制作转换表的辅助函数。   deletechars:str,optional(python 2)   要删除的字符串。此参数仅在python 2中有效。