我是python的新手,试图在单引号之间提取子串。你知道怎么用正则表达式做这个吗?
E.G输入
text = "[(u'apple',), (u'banana',)]"
我想将苹果和香蕉作为列表项提取,如['apple', 'banana']
答案 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
仅返回捕获的子字符串:
如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。
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 1和regex 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
。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']