我正在尝试解析python字符串中的某些特定文本。它实际上应该非常简单。
但更重要的是,我想知道正则表达式是否是一个“工具集”类型的东西,你知道一定数量的技巧吗?有些人对他们非常非常熟练,我希望达到这种熟练程度。
因此,当我问如何匹配此字符串时,我想在您解决问题时对您的思维过程进行解释
我基本上想要文本A,text-B和text_C,仅用逗号分隔。
所需的输出字符串:
"text A,text-B,text_C"
原文如下:
"(1, u'text A', u'text-B', u'text_C')"
在我有限的理解中,我理解将每个表达式分开的主要内容是单引号,所以我会从那开始。但最终我可能会有text-'A
这样的字符串,我想确保我没有遇到错误,因为我错误地解析了字符串。
感谢您的时间。记住:思考过程。
答案 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
编辑:好吧,如果它必须是正则表达式..不要介意这篇文章,它在许多情况下都不起作用。