Python разбить строку на пробел или предложение внутри круглых скобок - PullRequest
0 голосов
/ 25 октября 2018

Мне было интересно, можно ли разбить строку, такую ​​как

string = 'hello world [Im nick][introduction]'

, на массив, такой как

['hello', 'world', '[Im nick][introduction]']

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

Мне это нужно, потому что у меня есть файл уценки с предложениями, такими как

- What is the weather in [San antonio, texas][location]

Мне нужно, чтобы san antonio texas был полным предложением внутри массива, возможно ли это?Массив будет выглядеть так:

array = ['what', 'is', 'the', 'weather', 'in', 'San antonio, texas][location]']

Ответы [ 6 ]

0 голосов
/ 25 октября 2018

Для одного лайнера используйте функциональные инструменты программирования, такие как reduce из functool модуля

reduce( lambda x, y: x.append(y) if y and y.endswith("]") else x + y.split(), s.split(" ["))

или, немного короче с использованием стандартных операторов, map и sum

sum(map( lambda x: [x] if x and x.endswith("]") else x.split()), []) s.split(" [")) 
0 голосов
/ 25 октября 2018

Позвольте мне предложить альтернативу вышеупомянутым:

import re
string = 'hello world [Im nick][introduction]'
re.findall(r'(\[.+\]|\w+)', string)

Продукция:

['hello', 'world', '[Im nick][introduction]']
0 голосов
/ 25 октября 2018

Этот код ниже будет работать с вашим примером.Надеюсь, это поможет :) Я уверен, что это может быть лучше, но теперь я должен идти.Пожалуйста, наслаждайтесь.

string = 'hello world [Im nick][introduction]'
list = string.split(' ')
finall = []

for idx, elem in enumerate(list):
    currentelem = elem
    if currentelem[0] == '[' and currentelem[-1] != ']':
        currentelem += list[(idx + 1) % len(list)]
        finall.append(currentelem)
    elif currentelem[0] != '[' and currentelem[-1] != ']':
        finall.append(currentelem)

print(finall)
0 голосов
/ 25 октября 2018

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

s = 'What is the weather in [San antonio, texas][location]'

s = s.split(' [')
s[1] = '[' + s[1] # add back the split character

mod = s[0] # store in a variable 

mod = mod.split(' ') # split the first part on space

mod.append(s[1]) # attach back the right part

print(mod)

Выходы:

['What', 'is', 'the', 'weather', 'in', '[San antonio, texas][location]']

и для s = 'hello world [Im nick][introduction]'

['hello', 'world', '[Im nick][introduction]']
0 голосов
/ 25 октября 2018

Может быть, это может сработать для вас:

>>> s = 'What is the weather in [San antonio, texas][location]'
>>> i1 = s.index('[')
>>> i2 = s.index('[', i1 + 1)
>>> part_1 = s[:i1].split()    # everything before the first bracket
>>> part_2 = [s[i1:i2], ]      # first bracket pair
>>> part_3 = [s[i2:], ]        # second bracket pair
>>> parts = part_1 + part_2 + part_3
>>> s
'What is the weather in [San antonio, texas][location]'
>>> parts
['What', 'is', 'the', 'weather', 'in', '[San antonio, texas]', '[location]']

Он ищет левые скобки и использует их в качестве справки, прежде чем разбивать на пробелы.

Это предполагает:

  • что между первой закрывающей скобкой и второй открывающей скобкой нет другого текста.
  • что после второй закрывающей скобки ничего нет

Вотболее надежное решение:

def do_split(s):
    parts = []

    while '[' in s:
        start = s.index('[')
        end = s.index(']', s.index(']')+1) + 1  # looks for second closing bracket
        parts.extend(s[:start].split())     # everything before the opening bracket
        parts.append(s[start:end])          # 2 pairs of brackets
        s = s[end:]                         # remove processed part of the string

    parts.extend(s.split())                 # add remainder

    return parts

Это дает:

>>> do_split('What is the weather in [San antonio, texas][location] on [friday][date]?')
['What', 'is', 'the', 'weather', 'in', '[San antonio, texas][location]', 'on', '[friday][date]', '?']
0 голосов
/ 25 октября 2018

вы можете использовать регулярное выражение с lookbehind / lookahead, обратите внимание, что отфильтровать пустые записи с помощью фильтра или понимания списка проще, чем избежать в re

import re
s = 'sss sss bbb [zss sss][zsss ss]  sss sss bbb [ss sss][sss ss]'        
[x for x in re.split(r"(?=\[[^\]\[]+\])* ", s)] if x]
...