【问题标题】:Extract number from address with regex使用正则表达式从地址中提取数字
【发布时间】:2021-03-04 15:10:08
【问题描述】:

我需要从法国地址中提取数字。

这是我的正则表达式:

\d+( |\d+|bte|-|boite|[\w] {1}|([a-z] ){1}){0,2}

regex101 上的示例:https://regex101.com/r/ZP8DSV/1 它部分有效,但不适用于所有线路。

我需要提取数字+额外信息。

如果我拿这份清单,它应该给我这个(每行):

|---------------------------------------|--------------|
|              Original                 |     Result   |
|---------------------------------------|--------------|
| rue hovémont 3                        | 3            |
| rue hovémont 3-5                      | 3-5          |
| rue hovémont 3 5                      | 3 5          |
| Rue hovémont 35                       | 35           |
| Rue hovémont 46 A                     | 46 A         |
| Rue hovémont 46 A1                    | 46 A1        |
| 46 A1 Rue hovémont                    | 46 A1        |
| 46 A Rue hovémont                     | 46 A         |
| Rue du pont de pierre, 1              | 1            |
| Chaussée d alseg 416 c                | 416 c        |
| Chaussée d alseg, 416 c               | 416 c        |
| Chaussée d alseg 416c                 | 416c         |
| Chaussée d alseg, 416c                | 416c         |
| 416 c Chaussée d alseg                | 416 c        |
| 416 c, Chaussée d alseg               | 416 c        |
| 416c Chaussée d alseg                 | 416c         |
| 416c, Chaussée d alseg                | 416c         |
| Square de la demi-lune 7 boite 5      | 7 boite 5    |
| 7 boite 5 Square de la demi-lune      | 7 boite 5    |
| Rue aux laines 150/58                 | 150/58       |
| Rue de la forêt, 95                   | 95           |
| Chaussée d'anvers 294                 | 294          |
| Avenue jean sébastien bach, 24 bte 32 | 24 bte 32    |
| 10 bte 1 rue des volontaires          | 10 bte 1     |
| Rue du 5ème Tïme 5 bte 2              | 5 bte 2      |
| Rue du 5eme Tïme 5 bte 2              | 5 bte 2      |
| Rue du 5 eme Tïme 5 bte 2             | 5 bte 2      |
| Rue du 5 ème Tïme 5 bte 2             | 5 bte 2      |
| Rue du 1 er Tïme 5 bte 2              | 5 bte 2      |
| 20a Test Strasse                      | 20a          |
|---------------------------------------|--------------|

你能帮我处理这个案子吗? :)

【问题讨论】:

  • 你说得对。它是 46 A1。谢谢。
  • 如果这是整个列表,它是可行的。如果您想提取随机给定地址的数字,则不可能全部正确。

标签: php regex street-address


【解决方案1】:

这是一个有效的正则表达式,用于捕获以数字开头或结尾的文本:

^\d\w*(?:\h+(?>boite|bte|\pL\d?|\d)\b)*|\h\K\d+\pL?(?:[-/]\d+|\h+(?:boite|bte|\pL\d?|\d+)\b)*$

Updated RegEx Demo

对于 PHP 使用以下:

$re = '~^\d\w*(?:\h+(?>boite|bte|\pL\d?|\d)\b)*|\h\K\d+\pL?(?:[-/]\d+|\h+(?:boite|bte|\pL\d?|\d+)\b)*$~miu'

正则表达式详细信息:

  • ^:开始
  • \d\w*:匹配以数字开头的单词
  • (?::启动非捕获组
    • \h+: 匹配 1+ 个空格
    • (?>boite|bte|\pL\d?|\d):匹配 boitebte 或单个数字或字母(可选地后跟数字)
    • \b:字边界
  • )*:结束非捕获组。匹配该组中的 0 个或多个。
  • |:或者
  • \h: 匹配一个空格
  • \K:重置比赛
  • \d+\pL?:匹配 1+ 数字后跟可选字母
  • \b:字边界
  • (?:[-/]\d+|\h+(?:boite|bte|\pL\d?|\d+)\b)*:匹配剩余部分
  • $:结束

【讨论】:

  • 太棒了!我没有这种方法。我用另外三行更新了我的示例。如何在空格和“ème”或“er”之间使用您的正则表达式?
  • 非常适合 OP 给出的列表。但是对于街道名称中带有数字的地址,它会失败,例如 Place du 14 Juillet 16
  • 添加的示例@anubhava :)
  • @anubhava 你是绝对正确的,你不能得到每一个案例。但我最初的想法:这只是一些随机的示例列表,刚刚被更新的 OP 证明是正确的。跨度>
  • 太棒了!感谢您的帮助@anubhava!
猜你喜欢
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 2015-09-19
相关资源
最近更新 更多