Я не был уверен, даст ли ваше оригинальное регулярное выражение то, что вы хотели.
Извините, если я опаздываю на вечеринку ... Но другие тоже могут найти это полезным.
import re
p = r"AAAA(?=\s\w+)" #revised per comment from @Jerry
p2 =r"\w+ AAAA \w+"
s = "foo bar AAAA foo2 AAAA bar2"
l = re.findall(p, s)
l2 = re.findall(p2, s)
print('l: {l}'.format(l=l))
#print(f'l: {l}') is nicer, but online interpreters sometimes don't support it.
# https://www.onlinegdb.com/online_python_interpreter
#I'm using Python 3.
print('l2: {l}'.format(l=l2))
for m in re.finditer(p, s):
print(m.span())
#A span of (n,m) would really represent characters n to m-1 with zero based index
#So.(8,12):
# => (8,11: 0 based index)
# => (9th to 12th characters conventional 1 based index)
print(re.findall(p, s)[-1])
Выходы:
l: ['AAAA', 'AAAA']
l2: ['bar AAAA foo2']
(8, 12)
(18, 22)
AAAA
Причиной получения двух результатов вместо одного в оригинале является специальный соус (?=)
.
Это называется позитивный взгляд.
Он не ' потребляет ' (то есть перемещает курсор), когда совпадение найдено во время вычисления регулярного выражения. Итак, он возвращается после сопоставления.
Хотя в круглых скобках указаны положительные сообщения, они также действуют как группа без захвата .
Таким образом, хотя шаблон сопоставляется, результаты опускают окружающую последовательность буквенно-цифровых символов, представленных \w+
и промежуточными пробелами, \s
в моем примере -representing [ \t\n\r\f\v]
. (Подробнее здесь )
Так что я получаю только AAAA каждый раз.
p2
здесь, представляет исходный шаблон кода @SDD, человека, задающего вопрос.
foo2
- это , потребляемый , с этим шаблоном, чтобы второй AAAA не совпадал, так как курсор продвинулся слишком далеко, когда механизм регулярных выражений возобновляет свою вторую итерацию соответствия.
Я рекомендую взглянуть на видео Moondra на Youtube, если вы хотите углубиться.
Он сделал очень тщательную серию из 17 частей на Python Regex, начиная с здесь
Вот ссылка на онлайн переводчика Python