Как я могу извлечь кортежи из строки? - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть следующая строка:

r"(A1,B1,C1,D1),(A2,B2,C2,D2),..."

, и я хочу извлечь список кортежей

[(A1,B1,C1,D1),(A2,B2,C2,D2),...]

A, B и D - целые числа, а C - строка, заключенная в одинарные кавычки.Сложная часть определяется тем, что C может содержать любой символ, включая экранированные одинарные кавычки (\'), запятые (,), экранированные обратные косые черты (\\) и целые числа.Я пытаюсь решить эту проблему с помощью регулярных выражений, но я не могу понять, как это сделать.

До сих пор я пытался сопоставить конец строки, посмотрев на первую одиночную кавычку, котораяпредшествует четное количество обратных слешей (0, 2, 4, ...), но я не могу заставить его работать.Есть идеи?

Ожидаемые результаты:

  • r"(21,3,'abc\',57',1993)" -> (21,3,'abc\',57',1993)
  • r"(21,3,'abc\\',1993)" -> (21,3,'abc\\',1993)
  • r"(21,3,'abc\\\\\',57\\\\',1993)" -> (21,3,'abc\\\\\',57\\\\',1993)

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Вы можете использовать ast.literal_eval для оценки строки, содержащей литералы Python,

import ast
ip = r"(21,3,'abc\',57',1993)"
op = ast.literal_eval(ip)

print(op)
# output,
# (21, 3, "abc',57", 1993)


# verify that they are correct types,
for i in op:
    print("{} is {}".format(i, type(i)))

# output,
# 21 is <class 'int'>
# 3 is <class 'int'>
# abc',57 is <class 'str'>
# 1993 is <class 'int'>
0 голосов
/ 31 декабря 2018

Вы можете использовать шаблон

(?<=')(?:\\\\|\\'|[^'])+(?=',)|\d+

Для содержимого строки (взгляд вперед и назад ' с) будет повторяться группа, состоящая из:

  • \\\\ - две обратные косые черты (то есть, представляет одну литеральную обратную косую черту)
  • \\' - экранированный ' (то есть, представляет один литерал ')
  • [^'] - что угодно, кроме символа кавычки

Или оно будет соответствовать \d+, целым числам.

https://regex101.com/r/5beqXJ/1

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