2017-08-10 5 views
-3

Je cherche une solution pour scinder une adresse suisse représentative en une rue (et un numéro de rue) et un code postal (et le nom du lieu).Comment scinder une adresse suisse en une rue et un code postal en Python?

Suggest, je l'adresse suivante:

'Bahnhofstrasse 1, 8001 Zürich' 

Le résultat que je cherche est:

street: 'Bahnhofstrasse 1' 
place: '8001 Zürich' 

Cependant, parfois il y a une virgule et parfois pas. Mais le code postal est toujours composé de 4 chiffres?

J'ai utilisé le .split (') jusqu'ici mais cela ne fonctionne que lorsqu'une virgule est présente.

+1

sont les deux derniers champs dans vos données zip toujours et la ville? Je serais méfiant à la recherche de numéros à 4 chiffres comme finalement, vous frapperez une adresse à 4 chiffres. – AlG

+0

@ AIG Merci pour votre commentaire. Oui, exactement. La "rue" ne peut être qu'un nom mais les deux derniers champs sont toujours zip et ville. Bon point même si je suis assez sûr qu'il n'y a pas de numéros de rue à 4 chiffres. –

Répondre

3

Je ne vous attendez pas à des noms de ville à avoir des chiffres en eux, utilisez ce modèle ^(.*?),?\s*(\d{4}\D+)$Demo

^    # Start of string/line 
(    # Capturing Group (1) 
    .    # Any character except line break 
    *?   # (zero or more)(lazy) 
)    # End of Capturing Group (1) 
,    # "," 
?    # (zero or one)(greedy) 
\s    # <whitespace character> 
*    # (zero or more)(greedy) 
(    # Capturing Group (2) 
    \d   # <digit 0-9> 
    {4}   # (repeated {4} times) 
    \D   # <character that is not a digit> 
    +    # (one or more)(greedy) 
)    # End of Capturing Group (2) 
$    # End of string/line 
+0

@ alpha bravo Merci beaucoup. Ceci est exactement ce que je cherchais! –

0
(?P<street>.*?[0-9]+)(?P<place>.*?[0-9]+.*) 

Explaination

tout entre parenthèses () est un groupe de capture par en ajoutant ?P<street> nous lui donnons un nom de rue (qui est facultatif, mais plus facile à lire). Matches entre zéro et nombre illimité de fois, comme peu de fois que possible, en expansion au besoin

Cette information combinée fait une belle regex pour cela:

[0-9]+ signifie 1 ou plus le nombre

.*? signifie tout (paresseux) Situation

enter image description here