从字符串中提取第一个完整地址



我不确定如何告诉Python中的正则表达式在找到第一个匹配后停止。

显然你可以告诉regex是懒惰的,regex -停止后第一场比赛,我试图放置(.*?)在我的表达式结束,但这只是打破了它。我只是想让它在找到第一个完整的地址后停止并返回它。

带数据的示例代码:https://regexr.com/6okuv

在样本数据中,除"Hindenburgdamm 27, hygiene - institut"外,所有地址都被表达式接受。在"27"之后应该停在哪里?和return &;Hindenburgdamm 27&;和"Peschkestr。5/Holsteinische街44"它应该停在哪里?并返回"Peschkestr。5 a" .

Regex expression : 
^([A-Za-zÄäÖöÜüßsd.-]+?)s*([ds]+(?:s?[-+/]s?d+)?s*[A-Za-z]?-?[A-Za-z]?)?$
Sample data:
Berliner Str. 74
Hindenburgdamm 27, Hygiene-Institut
Peschkestr. 5a/Holsteinische Str. 44
Lankwitzer Str. 13-17a
Fidicinstr. 15A
Haudegen Weg 15/17
Johanna-Stegen-Strasse 14a-d
Friedrichshaller Str. 7
Südwestkorso 9

您可以为数字和尾随字符设置更具体的模式,并使用不区分大小写的匹配至少匹配一个数字:

^([A-ZÄäÖöÜüß.s-]+?)s*(d+(?:[/-]d+)?(?:[A-Z](?:-[A-Z])?)?)b

  • ^字符串
  • 起始
  • ([A-ZÄäÖöÜüß.s-]+?)捕集组1
  • s*匹配可选的空白字符
  • (捕获组
    • d+匹配1+数字
    • (?:[/-]d+)?可选匹配/-和1+数字
    • (?:[A-Z](?:-[A-Z])?)?可选地匹配A-Z,后跟可选的-和A-Z
  • )关闭第二组
  • bA字边界

Regex演示

如果你只需要匹配而不需要捕获组,你可以省略它们。

注意,在开头字符类中有像.,-s这样的字符,如果匹配不应该从这些字符中的任何一个开始,你可以从一个字符类开始,不带这些字符,后面跟着一个可选的重复字符类,仍然匹配至少1个字符。

^[A-ZÄäÖöÜüß][A-ZÄäÖöÜüß.s-]*?s*d+(?:[/-]d+)?(?:[A-Z](?:-[A-Z])?)?b

Regex演示

你可以试试这个模式

^([A-Za-zÄäÖöÜüßsd.-]+?s[0-9a-zA-zÄäÖöÜüß-]+?)[s/,]?

在任何情况下,如果你不希望匹配整行,不要使用$来期望正则表达式达到EOL。

最新更新