Python Regex在字符串中用双引号查找字符串

nom*_*omi 20 python regex

使用正则表达式的python中的代码,可以执行类似这样的操作

Input: Regex should return "String 1" or "String 2" or "String3" 
Output: String 1,String2,String3
Run Code Online (Sandbox Code Playgroud)

谢谢

Joh*_*erg 49

这就是你需要做的一切:

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'
Run Code Online (Sandbox Code Playgroud)

正如Li-aung Yip所指出的那样:(我几乎引用)

.+?是"非贪婪"的版本.+.它使正则表达式匹配最小数量的字符,而不是它可以使用的最多字符.贪婪的版本,.+将给出字符串1" or "String 2" or "String 3; 非贪婪版本.+?'String 1,String 2,String3'

另外(约翰再说),如果你想接受空字符串,.+改为.*.星号表示零或更多 - 加上表示至少一个.

  • 详细说明,`.+?`是`.+`的"非贪婪"版本.它使正则表达式匹配最小数量的字符,而不是它可以使用的最多字符.贪婪的版本`.+`,将提供`string 1"或"String 2"或"String 3`; 非贪婪的版本`.+?`给`String 1`,`String 2`,`String 3`. (18认同)

Boo*_*boo 7

高度赞成的答案没有考虑到双引号字符串可能包含一个或多个双引号字符(当然,正确转义)的可能性。为了处理这种情况,正则表达式需要使用正前瞻断言逐一累积字符,表明当前字符不是前面没有反斜杠的双引号字符(这需要负后瞻断言):

"(?:(?:(?!(?<!\\)").)*)"
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

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\\"" ')
Run Code Online (Sandbox Code Playgroud)

印刷:

"String 1" => String 1
"String 2" => String 2
"String3" => String3
"\"double quoted string\"" => "double quoted string"
Run Code Online (Sandbox Code Playgroud)