Python Regex: сопоставление фразы независимо от промежуточных пробелов - PullRequest
0 голосов
/ 08 марта 2019

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

Таким образом, если фраза "the quick brown fox" истрока "the quick brown fox jumped over the lazy dog", экземпляр "the quick brown fox" должен быть сопоставлен.

Метод, который я уже пробовал, состоял в том, чтобы заменить все экземпляры пробела в строке шаблоном регулярных выражений для пробела, но это не так.t всегда работает, если строка содержит символы, которые регулярные выражения не рассматриваются как литеральные.

Ответы [ 5 ]

1 голос
/ 08 марта 2019

Это должно работать:

import re

pattern = r'the\s+quick\s+brown\s+fox'
text = 'the           quick      brown        fox jumped over the lazy dog'

match = re.match(pattern, text)
print(match.group(0))

Вывод:

the           quick      brown        fox
0 голосов
/ 10 марта 2019

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

text = """the           quick      brown        fox
another line                    with single and multiple            spaces
some     other       instance     with        six                      words"""

Соответствует целым линиям

Первый соответствует всей строке, итерируя по одиночным строкам

pattern1 = re.compile(r'((?:\w+)(?:\s+|$))+')
for i, line in enumerate(text.split('\n')):
    match = re.match(pattern1, line)
    print(i, match.group(0))

Его вывод:

0 the           quick      brown        fox
1 another line                    with single and multiple            spaces
2 some     other       instance     with        six                      words

Совпадение целых строк

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

pattern2 = re.compile(r'(\w+)(?:\s+|$)')
for i, line in enumerate(text.split('\n')):
    for m in re.finditer(pattern2, line):
        print(m.group(1))
    print()

Его вывод:

the
quick
brown
fox

another
line
with
single
and
multiple
spaces

some
other
instance
with
six
words
0 голосов
/ 10 марта 2019

для общего случая:

  1. заменить каждую последовательность пробелов только одним пробелом.
  2. проверить, является ли данное предложение подстрокой строки послезамена

    import re
    
    pattern = "your pattern"
    
    for line in lines:
        line_without_spaces= re.sub(r'\s+', ' ', line)  
        # will replace multiple spaces with one space
        return pattern in line_without_spaces
    
0 голосов
/ 08 марта 2019

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

s = "the           quick      brown        fox"
' '.join(s.split()) == "the quick brown fox" # returns True
0 голосов
/ 08 марта 2019

Вы можете использовать это регулярное выражение. Отметьте здесь

(the\s+quick\s+brown\s+fox)
...