Question: I'm looking for a code in python using regex that can perform something like this

Input: `Regex should return "String 1" or "String 2" or "String3"` 

Output: `String 1,String2,String3`

I tried `r'"*"'`

Answer: 
Here's all you need to do:

```
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'

```

As pointed out by [Li-aung Yip](https://stackoverflow.com/users/1191425/li-aung-yip):

> 
> To elaborate, `.+?` is the "non-greedy" version of `.+`. It makes the regular expression match the smallest number of characters it can instead of the most characters it can. The greedy version, `.+`, will give `String 1" or "String 2" or "String 3`; the non-greedy version `.+?` gives `String 1`, `String 2`, `String 3`.
> 
> 
> 

In addition, if you want to accept empty strings, change `.+` to `.*`. Star `*` means zero or more while plus `+` means at least one.
The highly up-voted answer doesn't account for the possibility that the double-quoted string might contain one or more double-quote characters (properly escaped, of course). To handle this situation, the regex needs to accumulate characters one-by-one with a *positive lookahead assertion* stating that the current character is not a double-quote character that is not preceded by a backslash (which requires a *negative lookbehind assertion*):

```
"(?:(?:(?!(?<!\\)").)*)"

```

[See Regex Demo](https://regex101.com/r/Ls5VTU/1/)

```
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\\"" ')

```

Prints:

```
"String 1" => String 1
"String 2" => String 2
"String3" => String3
"\"double quoted string\"" => "double quoted string"

```