48

特定の区切り文字が n 番目に出現した後に文字列を分割する Python の方法はありますか?

与えられた文字列:

'20_231_myString_234'

これは次のように分割する必要があります (2 回目の出現の後、区切り文字は「_」になります)。

['20_231', 'myString_234']

それとも、これを達成する唯一の方法は、数えて、分割して、結合することですか?

4

8 に答える 8

71
>>> n = 2
>>> groups = text.split('_')
>>> '_'.join(groups[:n]), '_'.join(groups[n:])
('20_231', 'myString_234')

これが最も読みやすい方法のようですが、代替手段は正規表現です)

于 2013-06-12T07:57:05.830 に答える
8

を使用して、 が変数でreある形式の正規表現を取得します。^((?:[^_]*_){n-1}[^_]*)_(.*)n

n=2
s='20_231_myString_234'
m=re.match(r'^((?:[^_]*_){%d}[^_]*)_(.*)' % (n-1), s)
if m: print m.groups()

または素敵な機能があります:

import re
def nthofchar(s, c, n):
    regex=r'^((?:[^%c]*%c){%d}[^%c]*)%c(.*)' % (c,c,n-1,c,c)
    l = ()
    m = re.match(regex, s)
    if m: l = m.groups()
    return l

s='20_231_myString_234'
print nthofchar(s, '_', 2)

または正規表現なしで、反復検索を使用します。

def nth_split(s, delim, n): 
    p, c = -1, 0
    while c < n:  
        p = s.index(delim, p + 1)
        c += 1
    return s[:p], s[p + 1:] 

s1, s2 = nth_split('20_231_myString_234', '_', 2)
print s1, ":", s2
于 2013-06-12T07:40:38.043 に答える
5

実際の正規表現なしで機能し、別の「nth」または区切り文字に簡単に適応できるため、このソリューションが気に入っています。

import re

string = "20_231_myString_234"
occur = 2  # on which occourence you want to split

indices = [x.start() for x in re.finditer("_", string)]
part1 = string[0:indices[occur-1]]
part2 = string[indices[occur-1]+1:]

print (part1, ' ', part2)
于 2013-06-12T07:54:47.260 に答える
0

n番目の文字を分割するためのより大きな文字列があり、次のコードになりました。

# Split every 6 spaces
n = 6
sep = ' '
n_split_groups = []

groups = err_str.split(sep)
while len(groups):
    n_split_groups.append(sep.join(groups[:n]))
    groups = groups[n:]

print n_split_groups

ありがとう@perreal!

于 2015-04-23T11:07:10.000 に答える
0
>>>import re
>>>str= '20_231_myString_234'

>>> occerence = [m.start() for m in re.finditer('_',str)]  # this will give you a list of '_' position
>>>occerence
[2, 6, 15]
>>>result = [str[:occerence[1]],str[occerence[1]+1:]] # [str[:6],str[7:]]
>>>result
['20_231', 'myString_234']
于 2013-06-12T08:23:06.553 に答える