如何从字符串中提取元组?

时间:2018-12-30 23:52:49

标签: python regex

我有以下字符串:

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

我想提取一个元组列表

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

ABD是整数,而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 :(得分:3)

您可以使用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'>

答案 1 :(得分:0)

您可以使用模式

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

对于字符串内容(在'中向前和向后看),它将重复由以下任意一个组成的组:

  • \\\\-两个反斜杠(即,代表一个文字反斜杠)
  • \\'-转义的'(即代表单个文字'
  • [^']-除引号外的所有内容

或者,它将匹配\d+(整数)。

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