python中使用正则表达式执行类似
的代码Input: Regex should return "String 1" or "String 2" or "String3"
Output: String 1,String2,String3
由于
答案 0 :(得分:42)
以下是您需要做的所有事情:
def doit(text):
import re
matches=re.findall(r'\"(.+?)\"',text)
# matches is now ['String 1', 'String 2', 'String3']
return ",".join(matches)
doit('Regex should return "String 1" or "String 2" or "String3" ')
# result:
'String 1,String 2,String3'
正如李叶雄所指出的那样:(我几乎引用)
.+?
是.+
的“非贪婪”版本。它使正则表达式匹配最小数量的字符,而不是它可以使用的最多字符。贪婪的版本.+
将提供字符串1" or "String 2" or "String 3
;非贪婪版本.+?
'字符串1,字符串2,字符串3'
此外(Johan再次发言),如果您想接受空字符串,请将.+
更改为.*
。星号表示零或更多 - 加上表示至少一个。
答案 1 :(得分:2)
只需尝试从多行字符串中获取双引号字符串:
stopNum
答案 2 :(得分:0)
投票率很高的答案并不能说明双引号字符串可能包含一个或多个双引号字符的可能性(当然可以正确转义)。为了处理这种情况,正则表达式需要使用正向超前断言来逐个累加字符,该字符表明当前字符不是双引号字符,且前面没有反斜杠(这要求断言后面的消极):
"(?:(?:(?!(?<!\\)").)*)"
import re
import ast
def doit(text):
matches=re.findall(r'"(?:(?:(?!(?<!\\)").)*)"',text)
for match in matches:
print(match, '=>', ast.literal_eval(match))
doit('Regex should return "String 1" or "String 2" or "String3" and "\\"double quoted string\\"" ')
打印:
"String 1" => String 1
"String 2" => String 2
"String3" => String3
"\"double quoted string\"" => "double quoted string"
答案 3 :(得分:-1)
import re
r=r"'(\\'|[^'])*(?!<\\)'|\"(\\\"|[^\"])*(?!<\\)\""
texts=[r'"aerrrt"',
r'"a\"e'+"'"+'rrt"',
r'"a""""arrtt"""""',
r'"aerrrt',
r'"a\"errt'+"'",
r"'aerrrt'",
r"'a\'e"+'"'+"rrt'",
r"'a''''arrtt'''''",
r"'aerrrt",
r"'a\'errt"+'"',
"''",'""',""]
for text in texts:
print (text,"-->",re.fullmatch(r,text))
结果:
"aerrrt" --> <_sre.SRE_Match object; span=(0, 8), match='"aerrrt"'>
"a\"e'rrt" --> <_sre.SRE_Match object; span=(0, 10), match='"a\\"e\'rrt"'>
"a""""arrtt""""" --> None
"aerrrt --> None
"a\"errt' --> None
'aerrrt' --> <_sre.SRE_Match object; span=(0, 8), match="'aerrrt'">
'a\'e"rrt' --> <_sre.SRE_Match object; span=(0, 10), match='\'a\\\'e"rrt\''>
'a''''arrtt''''' --> None
'aerrrt --> None
'a\'errt" --> None
'' --> <_sre.SRE_Match object; span=(0, 2), match="''">
"" --> <_sre.SRE_Match object; span=(0, 2), match='""'>
--> None