Как правильно сгруппировать элементы в строку? - PullRequest
0 голосов
/ 23 октября 2019

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

[58729 58708]

[58729]

[58708]

[58729]

Мне нужно превратить их в список, но когда я использую list (), я получаю:

['[', '5', '8', '7', '2', '9', ']']

['[', '5', '8', '7', '0', '8', ']']

['[', '5', '8', '7', '2', '9', ']']

['[', '5', '8', '7', '2', '9', ' ', '5', '8', '7', '0', '8', ']']

Как мне сгруппировать их, чтобы они не были разделены на отдельных персонажей? Итак, как-то так:

['58729', '58708']

['58729']

['58708']

['58729']

Ответы [ 4 ]

0 голосов
/ 23 октября 2019

По-моему, королевским путем было бы объединить регулярное выражение с небольшим парсером:

from parsimonious.grammar import Grammar
from parsimonious.nodes import NodeVisitor
import re

data = """
[58729 58708]

[58729]

[58708]

[58729]
"""

# outer expression
rx = re.compile(r'\[[^\[\]]+\]')

# nodevisitor class
class StringVisitor(NodeVisitor):
    grammar = Grammar(
        r"""
        list    = lpar content+ rpar
        content = item ws?
        item    = ~"[^\[\]\s]+"
        ws      = ~"\s+"
        lpar    = "["
        rpar    = "]"
        """
    )

    def generic_visit(self, node, visited_children):
        return visited_children or node

    def visit_content(self, node, visited_children):
        item, _ = visited_children
        return item.text

    def visit_list(self, node, visited_children):
        _, content, _ = visited_children
        return [item for item in content]


sv = StringVisitor()
for lst in rx.finditer(data):
    real_list = sv.parse(lst.group(0))
    print(real_list)

, что привело бы к

['58729', '58708']
['58729']
['58708']
['58729']
0 голосов
/ 23 октября 2019

Пример использования модуля "ast"

import ast

data_str = '[58729 58708]'

data_str = data_str.replace(' ',',')  # make it '[58729, 58708]'

x = ast.literal_eval(data_str)


print(x)  
Out[1]:
    [58729, 58708]

print(x[0])
Out[2]:
    58729

print(type(x))
Out[3]:
    <class 'list'>

# and after all if you want exactly list of string:
[str(s) for s in x]
Out[4]:
    ['58729', '58708']
0 голосов
/ 23 октября 2019

Вы можете использовать regex для извлечения значений в квадратных скобках, затем split значений в список.

Код:

import re

s = '[58729 58708]'
result = re.search('\[(.*)\]', s).group(1).split()

Результат:

>>> %Run string2list.py
['58729', '58708']

>>> %Run string2list.py
<class 'list'>
0 голосов
/ 23 октября 2019

Допустим, ваша входная строка назначена переменной foo.

foo = '[58729 58708]'

Сначала вы хотите использовать нарезку списка, чтобы избавиться от скобок в начале и конце строки:

foo = foo[1:-1]

Теперь вы можете просто использовать метод string (), чтобы превратить строку в список. Здесь ввод split () - это символ, по которому список должен быть разделен. В вашем случае это будет один пробел:

foo.split(' ')

Возвращает

['58729', '58708'].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...