使用正则表达式清理邮政地址(spark regexp_extract)

问题描述 投票:0回答:1

我想剪掉一些地址的末尾:
"1 rue de l'église" => "1 rue de l'église"
"2 rue de la poste 公寓 B" => "2 rue de la poste"
"3 4 rue de la mairie 2eme étage" => "3 4 rue de la mairie"

规则是:如果在地址中间发现数字或关键字(“appartement”或“escalier”),则剪切前面的地址。

开头显然是“

^(\[0-9 \]\*
”,但我不能说“如果没有数字则取字符 OR 'appartement' OR 'escalier'”。

我的尝试之一:

my_df.select("adresse_rue").withColumn(
    "adresse_rue", 
    f.regexp_extract(
        "adresse_rue",
        r'^([0-9 ]*[^(0-9| appartement | escalier )]*)([0-9]| appartement | escalier )?.*$',
        0)).take(20)

也许

?:
?!
可以提供帮助,但我没有找到如何帮助。

python regex pyspark
1个回答
0
投票

使用正则表达式,您的方向是正确的。您可以使用 负前瞻 断言

(?!pattern)
来实现所需的结果。以下是修改正则表达式的方法:

r'^(?:(?! +(?:\d+[a-z]|appartement|escalier)).)*'

说明:

  • (?:\d+[a-z]|appartement|escalier)
    与您的关键字匹配(“appartement”或“escalier”,或后跟拉丁字母的任何数字序列)。
  • (?! +(?:\d+[a-z]|appartement|escalier))
    表示“后面至少没有一个空格和关键字”。
  • (?:(?! +(?:\d+[a-z]|appartement|escalier)).)*
    在每个匹配的字符之前进行此检查。

查看 演示 @ regex101.com

© www.soinside.com 2019 - 2024. All rights reserved.