提取单引号之间的子串

时间:2015-03-19 18:59:00

标签: python regex string

我是python的新手,试图在单引号之间提取子串。你知道怎么用正则表达式做这个吗?

E.G输入

 text = "[(u'apple',), (u'banana',)]"

我想将苹果和香蕉作为列表项提取,如['apple', 'banana']

3 个答案:

答案 0 :(得分:2)

text = "[(u'apple',), (u'banana',)]"   

print(re.findall(r"\(u'(.*?)',\)", text)
['apple', 'banana']

text = "[(u'this string contains\' an escaped quote mark and\\ an escaped slash',)]"
print(re.findall(r"\(u'(.*?)',\)", text)[0])
this string contains' an escaped quote mark and \ an escaped slash

答案 1 :(得分:2)

在一般情况下,要在单引号之间提取任何字符,最有效的正则表达式方法是

re.findall(r"'([^']*)'", text) # to also extract empty values
re.findall(r"'([^']+)'", text) # to only extract non-empty values

请参阅regex demo

<强>详情

  • ' - 单引号(无需在双引号字符串文字中转义)
  • ([^']*) - 一个capturing group,可以捕获除+以外的任何0+(如果使用'量词),则捕获1 +([^...]' 否定字符类,匹配除类中指定的字符之外的任何字符)
  • import re text = "[(u'apple',), (u'banana',)]" print(re.findall(r"'([^']*)'", text)) # => ['apple', 'banana'] - 收尾单引号。

请注意,如果在模式中指定了捕获组,re.findall仅返回捕获的子字符串:

  

如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。

Python demo

abc\'def

已撤消的报价支持

如果您需要支持转义引号(以便与'abc\'def'中的re.findall(r"'([^'\\]*(?:\\.[^'\\]*)*)'", text, re.DOTALL) # in case the text contains only "valid" pairs of quotes re.findall(r"(?<!\\)(?:\\\\)*'([^'\\]*(?:\\.[^'\\]*)*)'", text, re.DOTALL) # if your text is too messed up and there can be "wild" single quotes out there 匹配,则需要像

这样的正则表达式
(?<!\\)

请参阅regex variation 1regex variation 2演示。

模式详情

  • (?:\\\\)* - 如果当前位置左侧有反斜杠,则会导致匹配失败的负面反馈
  • ' - 0个或更多个连续的双反斜杠(因为它们不会转义相邻的字符)
  • ' - 开放([^'\\]*(?:\\.[^'\\]*)*)
  • re.findall - 第1组([^'\\]*将返回的内容)匹配...
    • ' - 除\(?:以外的0个或更多字符
    • \\. - 匹配的non-capturing group的开头
      • re.DOTALL - 任何转义字符(反斜杠和任何字符,包括[^'\\]*修饰符引起的换行符)
      • ' - 除\)*以外的0个或更多字符
  • ' - ...零次或多次
  • ' - 结束import re text = r"[(u'apple',), (u'banana',)] [(u'apple',), (u'banana',), (u'abc\'def',)] \\'abc''def' \\\'abc 'abc\\\\\'def'" print(re.findall(r"(?<!\\)(?:\\\\)*'([^'\\]*(?:\\.[^'\\]*)*)'", text)) # => apple, banana, apple, banana, abc\'def, abc, def, abc\\\\\'def

请参阅another Python demo

function change_letters(s::String)::String
    k = collect('a':'z')
    v = vcat(collect('b':'z'), 'A')
    d = Dict{Char, Char}(zip(k, v))
    for c in Set("eiou")
        d[c - 1] = uppercase(d[c - 1])
    end
    b = IOBuffer()
    for c in s
        print(b, d[c])
    end
    return String(take!(b))
end

答案 2 :(得分:1)

您也可以使用ast.literal_eval然后按列表推导提取第一项:

from ast import literal_eval

text = "[(u'apple',), (u'banana',)]"

literal_eval(text)
Out[3]: [(u'apple',), (u'banana',)]

[t[0] for t in literal_eval(text)]
Out[4]: [u'apple', u'banana']