Учитывая строку, как найти начальный и конечный индексы всех непробельных подстрок в python

#python #string #substring

#python #строка #подстрока

Вопрос:

Учитывая строку:

 ?           ^^^^    ^^^  --
  

Как я могу найти начальный и конечный индексы всех подстрок после первого символа?

Ожидаемый результат: (12,15), (20,22), (25,26)

Я попробовал следующее, но это работает только для первой подстроки, а не для остальных:

 string = '?           ^^^^    ^^^  --'
index = len(string ) - len(string .lstrip())
  

Комментарии:

1. Предположительно, под «подстрокой» вы на самом деле подразумеваете «последовательность одного или нескольких смежных символов, не содержащих пробелов»?

2. да, @JohnGordon это был бы более подходящий способ выразить это

3. Использование регулярных выражений, вероятно, было бы проще всего здесь, тем более, что вам также нужны начальный и конечный индексы. Что-то вроде re.findall('S ', string[1:]) .

4. используйте регулярное выражение S , re.finditer() а затем matchObj.span()

Ответ №1:

Используйте регулярное выражение для сопоставления любой последовательности непробельных подстрок. Match Объект содержит начальный и конечный индексы каждого совпадения.

 import re
string = '?           ^^^^    ^^^  --'
result = [(m.start(), m.end()-1) for m in re.finditer(r'S ', string)][1:]
  

[1:] Удаляет совпадение ? в начале.

Мне пришлось вычесть 1 из m.end() , потому что он указывает на индекс после совпадения (так что использование начала и конца в качестве диапазона приведет к полному совпадению).

Если первая подстрока может быть сразу после ? , вам нужно сначала разрезать строку, а затем добавить 1 к начальному индексу, а не вычитать из конечного индекса, чтобы скорректировать пропущенный первый символ.

 result = [(m.start() 1, m.end()) for m in re.finditer(r'S ', string[1:])]