基于多个可能的分隔符拆分字符串,但保留分隔符

2024-09-29 21:22:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在清理地址。我希望在特定的词(大街,大道,道路,地点等)后删除一切。在

我正打算做这样的事情,但我相信这会让一切都回到正轨。这意味着“1First avenue”将返回“1First”。在

我怎样才能附加这个(或者用不同的方式来做?)所以它会返回所有的内容,包括模式词?在

patterns = ["ave", "avenue", "road", "street" etc etc etc]
reduce(lambda s, pat: s.split(pat, 1)[0], patterns, string)

Tags: street内容地址方式模式etc事情patterns
3条回答

有几种方法可以达到这个目的。如果这里的reduce有一个意符,这是一种将答案保持在^{内的方法:

patterns = ["ave", "avenue", "road", "street"]
string = 'queen ave west'
reduce(lambda s, pat: s[:s.find(pat)+len(pat)] if s.find(pat) > 0 else s, patterns, string)

但是一个更好的解决方案可能是使用正则表达式。这会将所有可能的“模式”组合到一个正则表达式中,并通过python的正则表达式引擎运行整个过程:

^{pr2}$

如果您可以先使用正则表达式来编译多个地址,则可以先使用以下方法对每个地址进行编译:

import re

patterns = ["ave", "avenue", "road", "street"]
regex = re.compile(r'(.*)(' + '|'.join(patterns) + r')(.*)')
strings = ['queen ave west', 'should stay the same']
sanitized_strings = (regex.sub(r'\1\2', string) for string in strings)

现在,清理后的字符串包含清理后的字符串版本。您可以使用for循环遍历经过清理的\u字符串,然后打印它们或执行任何其他需要的操作。注意,按照正则表达式的设计方式,如果patterns中没有一个单词出现,整个字符串将匹配第一组。因此,如果没有一个单词出现,它将保持字符串不变,就像您请求的那样。在

我不确定这些是否就是你要找的确切语义。例如,您真的要为“queen ave west”返回“queen ave”吗。另外要注意的是,到目前为止提到的所有解决方案都没有考虑到其中一个模式是以街道的名字命名的,这很可能是因为你的模式包括缩写“st”,或者在多伦多,有一条叫做“Avenue road”的路。这些问题的答案取决于你想要达到的目标。在

你可以用这种紧凑的方式

print reduce (lambda s,x : str(s.split(x)[0]) if (str(s.split(x)[0]) == s) else str(s.split(x)[0]) + x,patterns)

完整的例子

^{pr2}$

我们使用reduce进行过滤,以了解何时读取分隔符单词

我想这就是你想要的。在

pattern = ['ave', 'street', 'road']
address = 'Imaginary ave, Fantasy Island'

for i in pattern:
    if i in address:
        print address[:address.find(i) + len(i)]

或者如果有地址列表

^{pr2}$

相关问题 更多 >

    热门问题