用分隔符解析字符串的最佳方法(思考正则表达式)?

时间:2013-08-02 22:45:37

标签: python regex string parsing pattern-matching

我正在尝试解析python字符串中的某些特定文本。它实际上应该非常简单。

但更重要的是,我想知道正则表达式是否是一个“工具集”类型的东西,你知道一定数量的技巧吗?有些人对他们非常非常熟练,我希望达到这种熟练程度。

因此,当我问如何匹配此字符串时,我想在您解决问题时对您的思维过程进行解释

我基本上想要文本A,text-B和text_C,仅用逗号分隔。

所需的输出字符串:

"text A,text-B,text_C"

原文如下:

"(1, u'text A', u'text-B', u'text_C')"

在我有限的理解中,我理解将每个表达式分开的主要内容是单引号,所以我会从那开始。但最终我可能会有text-'A 这样的字符串,我想确保我没有遇到错误,因为我错误地解析了字符串。

感谢您的时间。记住:思考过程。

2 个答案:

答案 0 :(得分:3)

由于您正在处理的字符串是Python元组的repr版本,因此最Pythonic的方法是使用ast.literal_eval,它可以获取该对象并安全地转换回保留正确类型的Python对象:

import ast
text = "(1, u'text A', u'text-B', u'text_C')"
tup = ast.literal_eval(text)

然后,如果您只想将每个字符串加在一起:

joined = ', '.join(el for el in tup if isinstance(el, basestring))
# text A, text-B, text_C

否则只需切片元组tup[1:]并加入其中的项目......

就正则表达式而言,一种快速,肮脏,非健壮的方法,在某些情况下容易破坏甚至可能提供不正确的匹配,是使用:

import re
string_vals = re.findall("'(.*?)'", text)

这会在'之后找到任何内容直到下一个' ...再次,使用ast.literal_eval在这里更好......

答案 1 :(得分:0)

一定是正则表达式吗? :(

a_str = "(1, u'text A', u'text-B', u'text_C')"
print ",".join(a_str[1:-1].split(",")[1:]).replace('u','').replace("'",'')

收率:

text A, text-B, text_C

编辑:好吧,如果它必须是正则表达式..不要介意这篇文章,它在许多情况下都不起作用。