在字符第一次和最后一次出现时拆分?



我有一个这样的字符串列表(金额、地址、付款(:

"44.53 54 orchard rd Cash"
"32.34 600 sprout brook lane Card"

我只是想从每个字符串中获取地址。在我看来,最好的方法是在空间的第一次和最后一次出现时分裂。有什么办法可以做到这一点吗?

Pythonsplit函数定义如下:str.split(sep=None, maxsplit=-1).

同样,也有str.rsplit(sep=None, maxsplit=-1).

这意味着您可以只拆分开头和结尾:

>>> s = "44.53 54 orchard rd Cash"
>>> s.split(maxsplit=1)
['44.53', '54 orchard rd Cash']
>>> s.rsplit(maxsplit=1)
['44.53 54 orchard rd', 'Cash']

然后,要简单地将字符串拆分为 3,您可以编写一个简单的函数:

>>> def purchase_parts(purchase):
...     lsplit = purchase.split(maxsplit=1)
...     rsplit = lsplit[1].rsplit(maxsplit=1)
...     return (lsplit[0], rsplit[0], rsplit[1])
... 
>>> purchase_parts("44.53 54 orchard rd Cash")
('44.53', '54 orchard rd', 'Cash')
>>> purchase_parts("32.34 600 sprout brook lane Card")
('32.34', '600 sprout brook lane', 'Card')

不过,我还是建议切换到分隔值列表,因为这样您就可以使用该分隔符进行拆分,但也直接支持导入/导出 csv 格式(逗号分隔值(文件。

手动解决方案:

>>> [p.strip() for p in "32.34, 600 sprout brook lane, Card".split(',')]
['32.34', '600 sprout brook lane', 'Card']

您可以执行以下操作:

line = "44.53 54 orchard rd Cash"
line_parts = line.split(" ")
address = " ".join(line_parts[1:-1])

它有点不整洁,对于行格式的更改肯定很脆弱,但可以完成这项工作。

您可以使用您的方法,在第一个和最后一个空格处拆分,但您需要将其余部分连接回来(在中间(:

def get_address(s):
s = s.split()
return ' '.join(s[1:-1])
# s[1:-1] will remove the first (amount) and the last (payment) values
# ' '.join will then put back the spaces that were removed from the address by s.split

输入:

print(get_address("44.53 54 orchard rd Cash"))
print(get_address("32.34 600 sprout brook lane Cash"))

输出:

54 orchard rd
600 sprout brook lane

您还可以使用正则表达式来使其更加灵活和健壮。在这里,前两个d+元素说你必须首先用一个点分隔两个数字,然后是一个空格,然后你的地址作为返回结果(在括号()(由任何字符(w(或([](空格字符(W(组成,直到一个空格和另一个字符序列(w+(。

import re
addresses = [
"44.53 54 orchard rd Cash",
"32.34 600 sprout brook lane Card"
]
addresses = [re.findall(r'd+.d+ ([wW]+) w+', address)[0] for address in addresses]
print(addresses)  # ['54 orchard rd', '600 sprout brook lane']

您可以使用解包和重新组装然后休息以形成地址来获得第一个和最后一个:

amount,*rest,payment = s.split()
address = " ".join(rest)

最新更新