python,正则表达式分裂和特殊字符

时间:2009-03-15 11:24:44

标签: python regex unicode split

如何使用空格作为分隔符正确分割包含具有特殊字符的句子的字符串? 使用正则表达式分割方法我无法获得所需的结果。

示例代码:

# -*- coding: utf-8 -*-
import re


s="La felicità è tutto" # "The happiness is everything" in italian
l=re.compile("(\W)").split(s)

print " s> "+s
print " wordlist> "+str(l)
for i in l:
    print " word> "+i

输出结果为:

 s> La felicità è tutto
 wordlist> ['La', ' ', 'felicit', '\xc3', '', '\xa0', '', ' ', '', '\xc3', '', '\xa8', '', ' ', 'tutto']
 word> La
 word>  
 word> felicit
 word> Ã
 word> 
 word> ?
 word> 
 word>  
 word> 
 word> Ã
 word> 
 word> ?
 word> 
 word>  
 word> tutto

而我正在寻找类似的输出:

 s> La felicità è tutto
 wordlist> ['La', ' ', 'felicità', ' ', 'è', ' ', 'tutto']
 word> La
 word>  
 word> felicità
 word>  
 word> è
 word>  
 word> tutto

需要注意的是,s是从另一个方法返回的字符串,因此我无法强制编码,如

s=u"La felicità è tutto"

关于Unicode和reg-ex的官方python文档,我没有找到令人满意的解释。

感谢。

的Alessandro

5 个答案:

答案 0 :(得分:16)

你的正则表达式应该是(\s)而不是(\W),如下所示:

l = re.compile("(\s)").split(s)

上面的代码将为您提供所需的确切输出。然而,以下行更有意义:

l = re.compile("\s").split(s)

分割空白字符,并不会将所有空格都作为匹配项。你可能需要它们,所以我发布了两个答案。

答案 1 :(得分:4)

尝试为正则表达式定义编码:

l=re.compile("\W", re.UNICODE).split(s)

答案 2 :(得分:3)

我认为在这种情况下使用正则表达式太过分了。如果您要做的唯一事情是将字符串拆分为空白字符,我建议在字符串上使用split方法

s = 'La felicità è tutto'
words = s.split()

答案 3 :(得分:3)

使用unicode正则表达式将起作用,只要你给它一个unicode字符串开始(你在提供的例子中没有)。试试这个:

s=u"La felicità è tutto" # "The happiness is everything" in italian
l=re.compile("(\W)",re.UNICODE).split(s)

print " s> "+s
print " wordlist> "+str(l)
for i in l:
    print " word> "+i

结果:

 s> La felicità è tutto
 wordlist> [u'La', u' ', u'felicit\xe0', u' ', u'\xe8', u' ', u'tutto']
 word> La
 word>  
 word> felicità
 word>  
 word> è
 word>  
 word> tutto

您的字符串s创建为str类型,可能采用utf-8编码,与unicode不同。

答案 4 :(得分:0)

那么, 经过对Andrew Hare的一些进一步测试后,我看到那个字符为()[] - 等等不再被认为是分隔符,而我想在用字母数字值集合组成的单词中分割一个句子(保持所有分隔符) set最终用重音字符扩展(即在unicode中标记为字母数字的所有内容)。 因此,kgiannakakis的解决方案更正确但它错过了将字符串s转换为unicode格式。

采用第一个例子的扩展名:

# -*- coding: utf-8 -*-
import re
s="(La felicità è tutto)"#no explicit unicode given string (UTF8)
l=re.compile("([\W])",re.UNICODE).split(unicode(s,'utf-8'))#split on s converted to unicode from utf8

print " string> "+s
print " wordlist> "+str(l)
for i in l:
    print " word> "+i

现在的输出是:

 string> (La felicità è tutto)
 wordlist> [u'', u'(', u'La', u' ', u'felicit\xe0', u' ', u'\xe8', u' ', u'tutto', u')', u'']
 word> 
 word> (
 word> La
 word>  
 word> felicità
 word>  
 word> è
 word>  
 word> tutto
 word> )
 word> 

这正是我正在寻找的。

干杯:)

的Alessandro