разделить строку с помощью регулярных выражений в Python - PullRequest
1 голос
/ 12 июля 2019

Каков наилучший способ разбить строку как

text = "hello there how are you"

в Python?

Таким образом, я бы получил такой массив:

['hello there', 'there how', 'how are', 'are you']

Я пробовал это:

liste = re.findall('((\S+\W*){'+str(2)+'})', text)
for a in liste:
    print(a[0])

Но я получаю:

hello there 
how are 
you

Как заставить функцию findall перемещать только один токен при поиске?

Ответы [ 6 ]

3 голосов
/ 12 июля 2019

Вот решение с re.findall:

>>> import re
>>> text = "hello there how are you"
>>> re.findall(r"(?=(?:(?:^|\W)(\S+\W\S+)(?:$|\W)))", text)
['hello there', 'there how', 'how are', 'are you']

Посмотрите документы Python для re: https://docs.python.org/3/library/re.html

  • (?=...) Утверждение о будущем
  • (?:...) Не фиксирующиеся регулярные скобки
1 голос
/ 12 июля 2019

Альтернативой является просто split, zip, затем join, например, так ...

sentence = "Hello there how are you"
words = sentence.split()
[' '.join(i) for i in zip(words, words[1:])]
1 голос
/ 12 июля 2019

Я не знаю, обязательно ли вам использовать регулярные выражения, но я бы сделал это следующим образом.

Сначала вы можете получить список слов с помощью метода str.split().

>>> sentence = "hello there how are you"
>>> splited_sentence = sentence.split(" ")
>>> splited_sentence
['hello', 'there', 'how', 'are', 'you']

Затем вы можете создавать пары.

>>> output = []
>>> for i in range (1, len(splited_sentence) ):
...     output += [ splited[ i-1 ] + ' ' + splited_sentence[ i ] ]
...
output
['hello there', 'there how', 'how are', 'are you']
1 голос
/ 12 июля 2019

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

string = "Hello there how are you"
liste = string.split(" ").pop(-1)
# we remove the last index, as otherwise we'll crash, or have an element with only one word
for i in range(len(liste)-1):
    liste[i] = liste[i] + " " + liste[i+1]
1 голос
/ 12 июля 2019

Если регулярное выражение не требуется, вы можете сделать что-то вроде:

l = text.split(' ')
out = []
for i in range(len(l)):
    try:
        o.append(l[i] + ' ' + l[i+1])
    except IndexError:
        continue

Пояснение:

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

0 голосов
/ 12 июля 2019

Другое возможное решение с использованием findall.

>>> liste = list(map(''.join, re.findall(r'(\S+(?=(\s+\S+)))', text)))
>>> liste
['hello there', 'there how', 'how are', 'are you']
...