微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用多个分隔符拆分字符串,但每个分隔符只拆分一次? Python

如何解决如何使用多个分隔符拆分字符串,但每个分隔符只拆分一次? Python

我正在尝试使用下面的所有分隔符分割一个字符串,例如下面的字符串,但只分割一次。

string = 'it; seems; like\ta good\tday to watch\va\vmovie.'

delimiters = '\t \v ;'

在这种情况下,输出将是:

['it',' seems; like','a good\tday to watch','a\vmovie.']

显然上面的例子是一个无意义的例子,但我试图了解这是否可行。一个相当复杂的正则表达式是否合适?

如果之前有人问过这个问题,我们深表歉意。我进行了大量搜索,但找不到与我的示例非常相似的内容。感谢您的时间!

解决方法

这应该可以解决问题:

facet normal -1.000000 0.000000 0.000000
outer loop
vertex 26.000000 6.000000 0.000000
vertex 26.000000 6.000000 1.000000
vertex 26.000000 7.000000 1.000000
endloop
endfacet
facet normal -1.000000 0.000000 0.000000
outer loop
vertex 26.000000 6.000000 0.000000
vertex 26.000000 7.000000 1.000000
vertex 26.000000 7.000000 0.000000
endloop
endfacet
facet normal 0.000000 1.000000 0.000000
outer loop
vertex 26.000000 7.000000 0.000000
vertex 26.000000 7.000000 1.000000
vertex 27.000000 7.000000 1.000000
endloop
endfacet
endsolid 

示例:

import re

def split_once_by(s,delims):
    delims = set(delims)
    parts = []
    while delims:
        delim_re = '({})'.format('|'.join(re.escape(d) for d in delims))
        result = re.split(delim_re,s,maxsplit=1)
        if len(result) == 3:
            first,delim,s = result
            parts.append(first)
            delims.remove(delim)
        else:
            break
    
    parts.append(s)
    return parts

燃烧酒精的回答激发了我写这个(IMO)更好的功能:

>>> split_once_by('it; seems; like\ta good\tday to watch\va\vmovie.','\t\v;')
['it',' seems; like','a good\tday to watch','a\x0bmovie.']

使用:

def split_once_by(s,delims):
    split_points = sorted((s.find(d),-len(d),d) for d in delims)
    start = 0
    for stop,_longest_first,d in split_points:
        if stop < start: continue
        yield s[start:stop]
        start = stop + len(d)
    yield s[start:]
,

只需创建一个模式列表并应用一次:

string = 'it; seems; like\ta good\tday to watch\va\vmovie.'
patterns = ['\t','\v',';']

for pattern in patterns:
    string = '*****'.join(string.split(pattern,maxsplit=1)) 

print(string.split('*****'))

输出:

['it','a\x0bmovie.']

那么,什么是 "*****" ??

在每次迭代中,当您应用 split 方法时,您会得到一个列表。因此,在下一次迭代中,您无法应用 .split () 方法(因为您有一个列表),因此您必须将该列表的每个值与一些奇怪的字符(如 "****" 或 {{ 1}} 或 "@@@" 或任何您想要的,以便在下一次迭代中重新应用 split()。 最后,对于字符串中的每个 "^^^^^^^",您将拥有一个列表模式,因此您可以使用它进行最终拆分。

,

一个简单的算法就可以了,

"*****"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。