2015-01-16 2 views
1

Учитывая строку следующим образом:Найдите подстроку после nth '|'

1|2||||auc|0|1||0|||76u| 
    ^

что является наиболее эффективным способом вернуть подстроку после 5 «|»? Например, с учетом приведенных выше строки, результат должен быть:

auc|0|1||0|||76u| 

ответ

4

Применение str.split:

s = '1|2||||auc|0|1||0|||76u|' 
print s.split('|', 5)[-1] 
# auc|0|1||0|||76u| 

Заметим, что это приведет, возможно, к нежелательным результатам, если не по крайней мере, 5 | с , например,

'1|2'.split('|', 5)[-1] 
# returns 2 - which isn't *after* the 5th 

присутствует в строке, поэтому вы может пожелать обернуть его в try/except и force handle в случае, когда не хватает | s, так что результат после 5-го пуст, так как не было 5 присутствующих.

try: 
    rest = s.split('|', 5)[5] 
except IndexError: 
    rest = '' 
+0

Ницца и чистый раствор. Если я могу добавить некоторые надежные общие сведения для записи: если у вас есть веские основания ожидать, что у хорошей части строк будет меньше пяти трубок, вы можете сначала разбить и проверить длину результата, а не ловить ошибку , – fnl

0
def get_substring(my_string): 
    count = 0 
    for i, char in enumerate(my_string): 
     if char == '|': 
      count += 1 
      if count == 5: 
       return my_string[i+1:] 
2

Используйте str.split() method с пределом (второй аргумент):

input_string.split('|', 5)[-1] 

Это разбивает строку в 5 раз, и принимает последний элемент, который имеет оставшиеся | Charaters цельным.

Если есть меньше чем 5 | символов в строке, вы все равно получите последний элемент из раскола, потому что [-1] рассчитывает с конца. Это означает, что выражение продолжает работать, даже если есть нулевой символов трубы в расколе.

Демо:

>>> input_string = '1|2||||auc|0|1||0|||76u|' 
>>> input_string.split('|', 5) 
['1', '2', '', '', '', 'auc|0|1||0|||76u|'] 
>>> input_string.split('|', 5)[-1] 
'auc|0|1||0|||76u|' 

и со ссылкой на документацию:

If maxsplit дается самое большее maxsplit расколы сделаны (таким образом, список будет иметь самое maxsplit+1 элементы).

0
s = '1|2||||auc|0|1||0|||76u|' 
sre = re.compile('([^|]*)(' + r*4 + ')(.*)') 

sre.search(s).groups() 
Out[39]: ('1', '|2|||', '|auc|0|1||0|||76u|') 

sre.search(s).group(3)[1:] 
Out[40]: 'auc|0|1||0|||76u|' 
Смежные вопросы