python re 编码 ä ö,芬兰语,定义什么是词
有没有办法让特定语言的字符被视为单词的一部分?
比如说,如果我用正则表达式(re)去搜索,想让字符 ä 和 ö 被当作单词字符,但现在它们不被接受。
Ft=codecs.open('c:\\Python27\\Scripts\\finnish2\\textfields.txt','r','utf–8')
word=Ft.readlines()
word=smart_str(word, encoding='utf-8', strings_only=False, errors='replace')
word=re.sub('[^äÄöÖåÅA-Za-z0-9]',"""\[^A-Za-z0-9]*""", word) ; print 'word= ', word #works in skipping ö,ä,å characters
我希望这些字符能被包含在 [A-Za-z] 这个范围内。要怎么定义呢?
3 个回答
像这样可能就能解决问题:
pattern = re.compile("(?u)pattern")
或者
pattern = re.compile("pattern", re.UNICODE)
首先,你似乎对re.sub的参数有点困惑。
第一个参数是模式。你写的是'[^äÄöÖåÅA-Za-z0-9]',这个模式会匹配所有不在芬兰字母表里的字符和数字。
第二个参数是替换内容。你写的是"""[^A-Za-z0-9]*""",这意味着每个不属于芬兰字母和数字的字符都会被替换成字面上的字符串[^A-Za-z0-9]*
。可以合理推测,这可能不是你想要的结果。
你到底想要做什么呢?
你需要解释一下你的第三行;在前两行之后,
word
会变成一个unicode
对象的列表,这样是好的。但是encoding=
和errors=
表明,那个我们不太了解的smart_str()正在把你漂亮的unicode又转换回UTF-8。处理UTF-8字节而不是Unicode字符是有问题的,除非你知道自己在做什么。你的源文件顶部有什么编码指令吗?
建议:把你的数据转换成unicode格式。用unicode来处理它。所有的字符串常量都应该加上
u
前缀;如果你觉得这样打字太麻烦,至少在非ASCII常量上加上,比如u'[^äÄöÖåÅA-Za-z0-9]'
。处理完所有内容后,使用合适的编码将结果编码以便显示或存储。在使用
re
时,可以考虑使用\w
,它会匹配任何字母数字字符(还包括下划线),而不是列出某种语言的字母。一定要使用re.UNICODE标志;文档可以在这里找到。
[A-Za-z0-9]
这个表示只会匹配这里列出的字符,但文档里还提到了一些其他特别的写法,比如:
\w
代表字母和数字字符(也就是[a-zA-Z0-9_]
还有所有被认定为字母数字的unicode字符)\W
代表所有不是字母数字的字符[^a-zA-Z0-9_]
还有unicode字符\d
代表数字\b
代表单词的边界(包括unicode表里的所有规则)
所以,你需要 (a) 使用这些写法(它们更简短,也许更容易理解),以及 (b) 告诉re你想要根据当前的地区设置来“本地化”这些字符串,通过设置UNICODE标志来实现,比如:
re_word = re.compile(r'\w+', re.U)