Извлечь строку между 2 строками и извлечь до конца, если вторая строка не найдена - PullRequest
0 голосов
/ 16 мая 2018

Каков шаблон для извлечения строки между 2 строками и извлечения до конца, если вторая строка не найдена?Например: чтобы получить значение, присвоенное foo (значение содержит пробелы)


import re

s1 = 'quz=1, 2, 3 and foo=4, 5, 6 and bar=7, 8, 9'
m = re.match(pattern=r'^.*foo=(.*)\sand', string=s1)

assert m.group(1) == '4, 5, 6'

s2 = 'quz=1, 2, 3 and foo=4, 5, 6'
m = re.match(pattern=r'^.*foo=(.*)', string=s2)

assert m.group(1) == '4, 5, 6'

Спасибо

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Вашему регулярному выражению необходимо разрешить конец строки and или с квантификатором lazy . В вашем регулярном выражении .* является жадным и будет пытаться сопоставить самую длинную строку до конца строки.

Следующее регулярное выражение должно работать для вас:

r'^.*foo=(.*?)(?:\sand|$)'

Вот полный код:

>>> s1 = 'quz=1, 2, 3 and foo=4, 5, 6 and bar=7, 8, 9'
>>> s2 = 'quz=1, 2, 3 and foo=4, 5, 6'
>>> p = r'^.*foo=(.*?)(?:\sand|$)'

>>> print re.findall(p, s1)
['4, 5, 6']

>>> print re.findall(p, s2)
['4, 5, 6']
0 голосов
/ 16 мая 2018

Вы можете использовать просмотр вперед (? = ...) с логикой или (следующий and или конец строки $):

Поскольку вы не соответствуете с начала строки, может быть удобнее использовать re.search; Нежадное регулярное выражение .*? лучше подходит, если вы хотите соответствовать только следующему and;

import re
re.search(r'foo=(.*?)(?= and|$)', s1).group(1)
# '4, 5, 6'
re.search(r'foo=(.*?)(?= and|$)', s2).group(1)
# '4, 5, 6'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...