我不确定如何告诉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-]+?)
捕集组1s*
匹配可选的空白字符(
捕获组d+
匹配1+数字(?:[/-]d+)?
可选匹配/
-
和1+数字(?:[A-Z](?:-[A-Z])?)?
可选地匹配A-Z,后跟可选的-
和A-Z
)
关闭第二组b
A字边界
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。