1

这是我的正则表达式:

(?P=<streetname>[a-zæøå ]+)(?:[ ]+)(?P=<housenumber>\d+)(?:[ ]+),(?:[ ]+)(?P=<postalcode>\d{1,4})(?:[ ]+)(?P=<city>[a-zæøå ]+)

所有组名仅包含 ASCII 字符,为什么会出错?

回溯(最近一次通话最后):
  文件“addrtools.py”,第 46 行,在
    主要的()
  文件“addrtools.py”,第 43 行,在 main
    extract_address('Testaddress 15B, 1234 奥斯陆')
  文件“addrtools.py”,第 35 行,在 extract_address
    匹配=重新匹配(pat_full,字符串)
  匹配中的文件“/Users/tomas/.pythonbrew/pythons/Python-2.7.3/lib/python2.7/re.py”,第 137 行
    return _compile(模式,标志).match(字符串)
  _compile 中的文件“/Users/tomas/.pythonbrew/pythons/Python-2.7.3/lib/python2.7/re.py”,第 242 行
    raise error, v # 无效表达式
sre_constants.error:组名中的错误字符

我已经确认pat_full确实包含上述​​正则表达式。此外,我的文档以 UTF-8 编码并设置为 UTF-8 模式 ( # --*-- Encoding: UTF-8 --*--)。

4

1 回答 1

9

您正在使用(?P=<name>...)模式,这意味着“匹配与先前名为 name 的组匹配的任何文本”。但是您没有像streetname之前定义的任何组。

删除=以使它们成为实际的命名组:

>>> re.compile('(?P<streetname>[a-zæøå ]+)(?:[ ]+)(?P<housenumber>\d+)(?:[ ]+),(?:[ ]+)(?P<postalcode>\d{1,4})(?:[ ]+)(?P<city>[a-zæøå ]+)')
<_sre.SRE_Pattern object at 0x102e6a620>

这可能是您最初打算做的事情。:-)

于 2012-09-08T11:57:27.670 回答