Найти позицию следующего вхождения в строке - PullRequest
0 голосов
/ 16 февраля 2019

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

Мне нужен параллельный массив, который содержит позиции найденных терминов.

Для пояснения предположим, что основная строка:

text = '11 scholars are selected to comptete on Feb 20 , 2019. 
Afterwards, 11 professors will review their submitted work. 
The results will be announced on Mar 20 , 2019.'

Как я уже сказал, я могусоответствует nums = ['11', '20', '2019', '11', '20', '2019'] из строки выше.Теперь я хочу сформировать синхронизированный массив, в котором хранятся позиции каждого из этих чисел.Я использую следующий фрагмент:

positions = []
for num in nums:
   pos = text.find(num)
   positions.append(num + ' : ' + str(pos))

Массив положений содержит: positions = ['11 : 0', '20 : 44', '2019 : 49', '11 : 0', '20 : 44', '2019 : 49'], что явно не то, что я хочу.Поскольку в списке есть повторяющиеся числа (например, два 11 или 12), text.find(num) возвращает первое вхождение термина.Таким образом, когда программа достигает следующего вхождения токена, она возвращает позицию первого вхождения.

Есть мысли о том, как это исправить?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

@ Подход Тьерри, безусловно, питоничен и хорошо использует регулярные выражения.Более простой подход заключается в следующем:

positions = []
i=0
for num in nums:
   pos = text.find(num, i)
   positions.append(num + ' : ' + str(pos))
   i =+ pos + len(num)

print(positions)
['11 : 0', '20 : 44', '2019 : 49', '11 : 68', '20 : 153', '2019 : 158']
0 голосов
/ 16 февраля 2019

Вы можете использовать finditer , который возвращает итератор, дающий объекты совпадений, и вы можете получить совпадающую строку и начальную позицию из этих совпадений:

import re

text = """11 scholars are selected to comptete on Feb 20 , 2019. 
Afterwards, 11 professors will review their submitted work. 
The results will be announced on Mar 20 , 2019."""

[(m.group(0), m.start()) for m in re.finditer(r'\d+', text)]
# [('11', 0), ('20', 44), ('2019', 49), ('11', 68), ('20', 154), ('2019', 159)]

Или, если хотитеэто отформатировано как в вашем вопросе:

['{}: {}'.format(m.group(0), m.start()) for m in re.finditer(r'\d+', text)]
# ['11: 0', '20: 44', '2019: 49', '11: 68', '20: 154', '2019: 159']
...