首页 > 解决方案 > 如何在pyspark中移动句子中的单词位置

问题描述

我有以下街道地址:

- KR 71D 6 94 SUR LC 1709
- KR 24B 15 20 SUR AP 301
- KR 72F 39 42 SUR
- KR 72F SUR 39 42
- KR 72 SUR 39 42

我需要的是检测仅位于地址板之后的 SUR 一词,将其删除,然后在主地址之后设置。例如:

- KR 71D 6 94 SUR LC 1709  <-- Change it to: KR 71D SUR 6 94 LC 1709
- KR 24B 15 20 SUR AP 301 <-- Change it to: KR 24B SUR 15 20 AP 301
- KR 72F 39 42 SUR <-- Change it to: KR 72F SUR 39 42
- KR 72F SUR 39 42 <-- It is ok, leave it this way
- KR 72 SUR 39 42 <-- It is ok, leave it this way

非常感谢,我希望有人可以帮助我。

标签: regexpysparkstreet-address

解决方案


你可以试试这个:

import re

lyst = ["KR 71D 6 94 SUR LC 1709","KR 24B 15 20 SUR AP 301","KR 72F 39 42 SUR","KR 72F SUR 39 42","KR 72 SUR 39 42"]

comp = re.compile(r'([a-zA-Z]+)(\s)(\w+)\s(\d+)\s(\d+)\s([a-zA-Z]+)(.*)$')

逻辑

使用括号中捕获匹配的逻辑,您可以捕获所有以空格分隔的单词(包括数字和单词)的匹配,对于SUR的匹配,我们需要匹配第五个单词并插入到第三个位置。因此,我们在 \6 中捕获它(大于 5,因为我们也匹配一个空格)。在这场比赛之后,使用 (.*) 选择单场比赛中的所有其他内容。我们在这里使用subre 模块。对于最后两个字符串,因为模式永远不会通过,因此没有任何内容被替换,字符串将保持原样。

newlyst = []
for items in lyst:
    newlyst.append(re.sub(comp, r'\1\2\3\2\6\2\4\2\5\7', items))

您可以打印newlyst以查看输出:

输出:

['KR 71D SUR 6 94 LC 1709', 'KR 24B SUR 15 20 AP 301', 'KR 72F SUR 39 42', 'KR 72F SUR 39 42', 'KR 72 SUR 39 42']

推荐阅读