【问题标题】:How to extract Dutch zip code with regex (Python)如何使用正则表达式(Python)提取荷兰邮政编码
【发布时间】:2021-10-13 06:56:19
【问题描述】:

假设我有以下列表:

[4486AE Capelle aan de Ijsel, 4706TR Amsterdam]

我想提取每个元素的邮政编码。

想要的输出是:

[4486AE, 4706TR]

我试图在 Python 中找到荷兰邮政编码的正则表达式。但是,我只找到了一个 JavaScript 表达式。这是我迄今为止尝试过的:

import re

test = '4706TR Amsterdam'
match =  re.search(r"/^(?:NL-)?(\d{4})\s*([A-Z]{2})$/i", test)
print(match)

这给了我一个空的结果。这是我从中得到表达式的地方:https://rgxdb.com/r/4W9GV8AC

有人知道如何解决这个问题吗?其他 SO 帖子不关注荷兰邮政编码的 Python 表达式。

【问题讨论】:

  • /^ 你不想逃避它。 ^ 表示行首,\^ 表示匹配不在您的字符串中的文字 ^。另外,为什么\i$ 之后? $ 表示行尾,因此您将永远不会匹配,因为您希望在行尾之后有一个 \i
  • 只使用^(?:NL-)?(\d{4})\s*([A-Z]{2})$ 对我有用
  • 将表达式更改为您的仍然给我一个空输出... match = re.search(r"^(?:NL-)?(\d{4})\s*([ AZ]{2})$", '4706TR 阿姆斯特丹')
  • 删除 ^$ 因为你没有匹配整行:(?:NL-)?(\d{4})\s*([A-Z]{2})
  • 试试(?:NL-)?(\d{4})\s*([A-Z]{2})(?!P.*)

标签: python python-3.x regex pandas


【解决方案1】:

您尝试的模式/^(?:NL-)?(\d{4})\s*([A-Z]{2})$/i 有一个 Javascript 表示法。

前导和尾随 / 是模式分隔符,^$ 是断言字符串开始和结束的锚点,/i 标志用于不区分大小写的匹配。

在 Python 中,要在您的问题中找到匹配项,您可以在单词边界 \b 之间匹配 4 个数字和 2 个大写字符 AZ,以防止部分匹配,而不是使用锚点,因为匹配项不是唯一的字符串。

不区分大小写的匹配可以使用re.IGNORECASE来完成

使用re.search也可以返回None,所以先检查re.search是否有值,然后使用.group()获取匹配。

import re

test = '4706TR Amsterdam'
match =  re.search(r"\b\d{4}[A-Z]{2}\b", test, re.IGNORECASE)
if match:
    print(match.group())

输出

4706TR

查看Python demo

如果你想匹配一个可选的NL- 部分,模式可以是:

\b(?:NL-)?\d{4}[A-Z]{2}\b

Regex demo

【讨论】:

  • 很好的答案。 re.IGNORECASE 也被称为 re.I,对于那些喜欢更紧凑版本的人。
  • 我忘记了 \b 是一个东西。这是一个更好的答案。
猜你喜欢
  • 2013-07-27
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 2016-01-12
相关资源
最近更新 更多