Как я могу получить список всех возможных совпадений между не жадными и жадными - PullRequest
0 голосов
/ 15 мая 2018

У меня есть строка "I like lettuce and carrots and onions" в Python.

Я думал, что смогу получить следующие совпадения ["I like lettuce", "I like lettuce and carrots", "I like lettuce and carrots and onions"], используя регулярное выражение типа .* and.(Регулярное выражение должно соответствовать любому символу до «и».)

Однако использование жадной версии (.* and) дает мне только последнее совпадение и использование не жадной версии (.*? and)дает мне только первое совпадение.

Как мне получить все три совпадения?

(мне не нужно решение регулярных выражений.)

Ответы [ 3 ]

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

Вы можете использовать простое разбиение и создавать строки без дорогих regex:

s = "I like lettuce and carrots and onions and dressing."

splitted = s.split('and')
for x in range(1, len(splitted)):
    print('and'.join(splitted[:x]))

# I like lettuce
# I like lettuce and carrots                                  
# I like lettuce and carrots and onions                        

Если вам нужен результат в списке, перейдите к списку-пониманию:

>>> s = "I like lettuce and carrots and onions and dressing."
>>> splitted = s.split('and')
>>> ['and'.join(splitted[:x]) for x in range(1, len(splitted))]
['I like lettuce ', 'I like lettuce and carrots ', 'I like lettuce and carrots and onions ']                              
0 голосов
/ 15 мая 2018

Для забавы используйте метод строки partition в Python 3. Он ищет строку для подстроки и возвращает 3-кортеж.Когда есть совпадение, это

(строка перед совпадением, совпадение, строка после совпадения)

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

def findallprefix(s, sep):
    sofar = ""
    while True:
        head, matched, s = s.partition(sep)
        if matched:
            assert matched == sep
            sofar += head
            yield sofar
            sofar += matched
        else:
            break

s = "I like lettuce and carrots and onions and dressing."
for match in findallprefix(s, " and"):
    print(repr(match))

, который печатает

'I like lettuce'
'I like lettuce and carrots'
'I like lettuce and carrots and onions'
0 голосов
/ 15 мая 2018

Я бы вообще не использовал re: Что не так с:

p = "I like lettuce and carrots and onions and dressing.".split("and")

, который дает вам список, из которого вы строите нужные строки.

...