如何在pyspark中移动句子中的单词位置

时间:2018-06-29 16:24:36

标签: regex pyspark street-address

我有以下街道地址:

- 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

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

1 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

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,因为我们也匹配一个空格)。这场比赛之后,使用(。*)选择一次比赛中的所有其他比赛。我们在这里使用sub的re模块。对于最后两个字符串,由于模式永远不会通过,因此不会替换任何内容,并且字符串将保持原样。

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']