Найти начальный и конечный индекс каждого уникального символа в строке в Python - PullRequest
2 голосов
/ 21 сентября 2019

У меня есть строка с повторяющимися символами.Моя работа состоит в том, чтобы найти начальный индекс и конечный индекс каждого уникального символа в этой строке.Ниже приведен мой код.

import re
x = "aaabbbbcc"
xs = set(x)
for item in xs:
     mo = re.search(item,x)
     flag = item
     m = mo.start()
     n = mo.end()
     print(flag,m,n)

Вывод:

a 0 1
b 3 4
c 7 8

Здесь конечный индекс символов не является правильным.Я понимаю, почему это происходит, но как передать динамически сопоставляемый символ в функцию поиска по регулярному выражению.Например, если я жестко закодировал символ в функции поиска, он выдает желаемый результат

x = 'aabbbbccc'
xs = set(x)
mo = re.search("[b]+",x)
flag = item
m = mo.start()
n = mo.end()
print(flag,m,n)

output:

b 2 5

Вышеуказанная функция дает правильный результат, но здесь я не могу передатьсимволы должны быть сопоставлены динамически.Это действительно поможет, если кто-нибудь подскажет, как этого добиться, подойдет любой намек.Заранее спасибо

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Глядя на вывод, я предполагаю, что другой вариант будет,

import re
x = "aaabbbbcc"
xs = re.findall(r"((.)\2*)", x)

start = 0
output = '' 
for item in xs:
    end = start + len(item[0])
    output += (f"{item[1]} {start} {end}\n")
    start = end

print(output)

Вывод

a 0 3
b 3 7
c 7 9

Я думаю, что это будет в порядке N, выможет, скорее всего, сравнить его, если хотите.

import re, time

timer_on = time.time()

for i in range(10000000):
    x = "aabbbbccc"
    xs = re.findall(r"((.)\2*)", x)

    start = 0
    output = '' 
    for item in xs:
        end = start + len(item[0])
        output += (f"{item[1]} {start} {end}\n")
        start = end

timer_off = time.time()

timer_total = timer_off - timer_on

print(timer_total)
1 голос
/ 21 сентября 2019

Строковое буквальное форматирование на помощь:

import re

x = "aaabbbbcc"
xs = set(x)
for item in xs:
    # for patterns better use raw strings - and format the letter into it
    mo = re.search(fr"{item}+",x)  # fr and rf work both :) its a raw formatted literal
    flag = item
    m = mo.start()
    n = mo.end()
    print(flag,m,n)  # fix upper limit by n-1

Вывод:

a 0 3   # you do see that the upper limit is off by 1?
b 3 7   # see above for fix
c 7 9

Ваш шаблон не нуждается в [] вокруг буквы - выв любом случае совпадают только с одним.


Без регулярных выражений 1 :

x = "aaabbbbcc"
last_ch = x[0]
start_idx = 0
# process the remainder
for idx,ch in enumerate(x[1:],1):
    if last_ch == ch:
        continue
    else:
        print(last_ch,start_idx, idx-1)
        last_ch = ch
        start_idx = idx
print(ch,start_idx,idx)

Вывод:

a 0 2   # not off by 1
b 3 6
c 7 8

1 RegEx: И теперь у вас есть 2 проблемы ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...