Регулярное выражение Python: сопоставление фразы независимо от промежуточных пробелов

#python #regex #whitespace

#python #регулярное выражение #пробел

Вопрос:

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

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

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

Комментарии:

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

2. Пожалуйста, добавьте больше примеров данных. Если вы показываете только одну строку, мы не можем увидеть более широкий шаблон.

Ответ №1:

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

 import re

pattern = r'thes quicks browns fox'
text = 'the           quick      brown        fox jumped over the lazy dog'

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

Результат таков:

 the           quick      brown        fox
  

Комментарии:

1. Спасибо за ваш ответ. Есть ли способ обобщить это решение, чтобы мне не приходилось вручную создавать шаблон регулярного выражения для каждой строки? Программа, над которой я работаю, выполняет итерации по многим строкам.

Ответ №2:

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

 (thes quicks browns fox)
  

Комментарии:

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

2. Более одной строки. Это одинаковые предложения?

3. Строка и фраза каждый раз разные.

4. Можете ли вы привести пример еще 3-5 фраз? Таким образом, мы можем распознать шаблон. Вы хотите получить первые 4 слова в каждой фразе?

Ответ №3:

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

 s = "the           quick      brown        fox"
' '.join(s.split()) == "the quick brown fox" # returns True
  

Ответ №4:

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

  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
      

Ответ №5:

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

 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