Python - 正则表达式 - 排序日语地址

时间:2014-08-31 12:12:31

标签: python regex

我必须擦洗很多日文地址。这个正则表达式适用于两个正则表达式测试站点,但我在Windows终端上没有得到相同的结果;我在Windows 7上使用Python 2.7.8。

以下是pythonregex.com的结果:

string = "北海道札幌市西区二十四軒1条7丁目"
regex = re.compile("(.{2,3}?[県|道|府|都]{1})?((?:.+?市.+?区)|(?:.+?郡.+?町)|(?:.+?[市|区|町|村]))?([^0-9]+)?([0-9]+)?(?:[-|-]([0-9-]+))?")
r = regex.search(string)
r
<_sre.SRE_Match object at 0x350aeaba58a52420>
regex.match(string)
<_sre.SRE_Match object at 0x350aeaba58a524e8>

# List the groups found
r.groups()
(u'\u5317\u6d77\u9053', u'\u672d\u5e4c\u5e02\u897f\u533a',u'\u4e8c\u5341\u56db\u8ed2\uff11\u6761\uff17\u4e01\u76ee', None, None)

这恰当地给了我三组:

 北海道
 札幌市西区
 二十四軒1条7丁目

但在我的终端上,相同的代码产生了这个:

regex = re.compile("(.{2,3}?[県|道|府|都]{1})?((?:.+?市.+?区)|(?:.+?郡.+?町)|(?:.+?[市|町|村]))?([^0-9]+)?([0-9]+)?(?:[-|-]([0-9-]+))?")
r = regex.search(string)
r
<_sre.SRE_Match object at 0x00000000020FED20>
r.groups()
(None, '\x96k\x8aC\x93\xb9\x8eD\x96y\x8es\x90\xbc\x8b\xe6','\x93\xf1\x8f\\\x8el\x8c\xac\x82P\x8f\xf0\x82V\x92\x9a\x96\xda', None, None)

这给了我没有匹配的第一组,并将第二组和第三组混为一谈。然而,在2个不同的Python正则表达式测试站点上,我得到了期望的结果(地址分为3个单独的字符串)。我的终端有什么问题?

谢谢。

2 个答案:

答案 0 :(得分:1)

可能你需要在脚本标题上添加编码:

#!/usr/bin/python
# -*- coding: utf-8 -*-

http://legacy.python.org/dev/peps/pep-0263/

如果它不起作用,你应该尝试将字符串定义为unicode字符串:

u"I'm a string"

如果它仍然不起作用,请尝试将日语汉字字符替换为它们的unicode代码点。

u"\u23ef" 

更多相关信息: https://docs.python.org/2/tutorial/introduction.html#unicode-strings

答案 1 :(得分:0)

您需要在将输入字符串分配给变量时添加u,以便python将其作为unicode字符串,并且还需要在正则表达式编译代码中包含re.UNICODE修饰符。

>>> string = u"北海道札幌市西区二十四軒1条7丁目"
>>> regex = re.compile(u"(.{2,3}?[県|道|府|都]{1})?((?:.+?市.+?区)|(?:.+?郡.+?町)|(?:.+?[市|町|村]))?([^0-9]+)?([0-9]+)?(?:[-|-]([0-9-]+))?", re.UNICODE)
>>> r = regex.search(string)
>>> r
<_sre.SRE_Match object at 0x7f1e45714dd8>
>>> r.groups()
(u'\u5317\u6d77\u9053', u'\u672d\u5e4c\u5e02\u897f\u533a', u'\u4e8c\u5341\u56db\u8ed2\uff11\u6761\uff17\u4e01\u76ee', None, None)