Regex возвращает X слов до и после матча рекурсивно - PullRequest
0 голосов
/ 25 сентября 2019

Этот подход работает идеально получить 3 слова до и после

Но если совпадение находится внутри этого диапазона, остальные игнорируются получить 6 слов до и после DEMO вернуть только одно совпадение вместо 2.

Ожидаемый результат

full match 1: 5 pollici, Fotocamera 20 MP, 2GB RAM RAM Processore Quad-Core 2,2GHz, Memoria 32GB, 

full match 2: pollici, Fotocamera 20 MP, 2GB RAM RAM Processore Quad-Core 2,2GHz, Memoria 32GB, Windows

Это просто совпадение 1

1 Ответ

0 голосов
/ 25 сентября 2019

Вы можете использовать этот подход, используя re.finditer:

>>> s = 'Nokia Lumia 930 Smartphone, Display 5 pollici, Fotocamera 20 MP, 2GB RAM RAM Processore Quad-Core 2,2GHz, Memoria 32GB, Windows Phone 8.1, Bianco [Germania]'
>>> regex = r"\s*\bRAM\b(?=\s*((?:\S+\s+){0,5}\S+))"
>>> for m in re.finditer(regex, s):
...     print ( re.findall(r'((?:\S+\s+){0,5}\S+)$', s[1:m.start()])[0], m.group(1) )
...

('5 pollici, Fotocamera 20 MP, 2GB', 'RAM Processore Quad-Core 2,2GHz, Memoria 32GB,')
('pollici, Fotocamera 20 MP, 2GB RAM', 'Processore Quad-Core 2,2GHz, Memoria 32GB, Windows')

Если вы хотите только полные совпадения, используйте:

>>> for m in re.finditer(regex, s):
...     print ( re.findall(r'((?:\S+\s+){0,5}\S+)$', s[1:m.start()])[0] + m.group(1) )
...

5 pollici, Fotocamera 20 MP, 2GBRAM Processore Quad-Core 2,2GHz, Memoria 32GB,
pollici, Fotocamera 20 MP, 2GB RAMProcessore Quad-Core 2,2GHz, Memoria 32GB, Windows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...