2016-06-20 2 views
0

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

you and he and she and me 

И мое регулярное выражение (до сих пор):

(\w+) and (\w+) 

То, что я хочу, это должно дать этот результат:

(you, he), (he, she), (she, me) 

но текущий результат всего 2 матча, которые являются

(you, he), (she, me) 

Как достичь этого?

ответ

1

Что вы запрашиваете, это overlapping regexes.

Это, как вы это делаете:

import re                  

s = "you and he and she and me"             

print re.findall(r'(?=\b(\w+) and (\w+)\b)', s) 

На самом деле это не такая хорошей работа ищет наложения, вы будете нуждаться в \b «S я добавил, чтобы указать, вы хотите, чтобы соответствовать границам слов. В противном случае вы получите:

[('you', 'he'), ('ou', 'he'), ('u', 'he'), ('he', 'she'), ('e', 'she'), ('she', 'me'), ('he', 'me'), ('e', 'me')] 
0

Вы можете использовать нулевую ширину положительный предпросмотр как:

(?=(?:^|\s)(\w+)\s+and\s+(\w+)) 
  • Нулевая ширина картины опережения начинается с (?= и заканчивается в последний )

  • (?:^|\s) является незахваченной группой, гарантируя, что желаемые шаблоны начинаются или сопровождаются пробелами

  • (\w+)\s+and\s+(\w+), вылезает нужный шаблон с первой и второй групп, захваченных

Пример:

In [11]: s = 'you and he and she and me' 

In [12]: re.findall(r'(?=(?:^|\s)(\w+)\s+and\s+(\w+))', s) 
Out[12]: [('you', 'he'), ('he', 'she'), ('she', 'me')] 
0

Как и другие указали на это, то, что вы ищете, называется перекрывающиеся матчей ,
С новой regex module, вы можете придерживаться своего первоначального подхода и применить другой флаг:

import regex as re 

string = "you and he and she and me" 
rx = r'\b(\w+) and (\w+)\b' 

matches = re.findall(rx, string, overlapped=True) 
print matches 
# [('you', 'he'), ('he', 'she'), ('she', 'me')] 

Подсказка: вы будете нуждаться границами слов на вершине (\b), в противном случае вы получите неожиданные результаты.

Смежные вопросы