用Python正则表达式分割字符串中的字符

4

我正在尝试分割这个字符串:

> s = Ladegårdsvej 8B7100 Vejle

使用正则表达式转换为:
[street,zip,city] = ["Ladegårdsvej 8B", "7100", "Vejle"]

s的变化很大,唯一确定的部分是邮政编码后面总是有一个空格,且邮编总是4位数字。我的想法是从右侧开始匹配这个4位数字和空格,以此指示应该在字符串的那个位置拆分字符串。

目前我能够通过以下方式获取streetcity

> print re.split(re.compile(r"[0-9]{4}\s"), s)
["Ladegårdsvej 8B", "Vejle"]

我该如何按照要求分割字符串 s?特别是在位于streetzip之间的数字中间如何进行分割?


所有字符串的整体格式都与该字符串相同吗?如果是这样,那么您可以只在空格上拆分它,因为这似乎是三个之间的分隔符。 - Professor_Joykill
1
@Professor_Joykill:街道和邮政编码之间没有空格。 - Scott Hunter
1
@Professor_Joykill请注意,OP想要将7100而不是8B7100放入zip中。 - Błotosmętek
2
请查看 https://ideone.com/dmyo6b,您可以匹配和*捕获*部分。 - Wiktor Stribiżew
3个回答

9

您可以使用re.split,但需要将四个数字作为捕获组:

>>> s = "Ladegårdsvej 8B7100 Vejle"
>>> re.split(r"(\d{4}) ", s)
['Ladegårdsvej 8B', '7100', 'Vejle']

来自文档(我强调)

按模式出现的位置拆分字符串。如果在模式中使用捕获括号,则模式中所有组的文本也作为结果列表的一部分返回。如果maxsplit非零,则最多发生maxsplit次拆分,并将字符串的剩余部分作为列表的最后一个元素返回。


1
一旦有了街道信息,获取邮政编码就是微不足道的事情:

zip = s[len(street):len(street)+4]

0

这是您问题的解决方案。

# -*- coding: utf-8 -*-
import re
st="Ladegårdsvej 8B7100 Vejle"
reg=r'([0-9]{4})'
rep=re.split(reg,st)
print rep

根据RasmusP_963先生提供的其他测试用例解决方案。

# -*- coding: utf-8 -*-
import re
st="Birkevej 8371900 Roskilde"
print re.split(r"([0-9]{4}) ",st)

这样做行不通,因为可能会有一个没有字母的长房号“街道”地址(例如“Birkevej 8371900 Roskilde”),所以我需要在后面包括空格以确保它与最后四个数字(即“邮政编码”)匹配。 - RasmusP_963

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接