如何用正则表达式匹配Python代码中含转义引号的字符串
解决Python字符串(含转义引号)的正则匹配问题
Got it, let's tackle this regex problem you're having! The issue with your original pattern "\"[^\"]*\"" is that it stops as soon as it hits a "—even if that quote is escaped with a backslash. Let's fix that.
核心思路
我们需要一个正则表达式,能匹配转义引号(\")或者任何非普通引号的字符,这样转义后的引号就不会被误判为字符串的结束符。
可行的正则表达式
这里是你需要的匹配模式:
"(?:\\"|[^"])*"
模式拆解:
": 匹配开头的双引号。(?:...): 非捕获分组(使用它是为了让re.findall直接返回完整的带引号字符串,而不是分组内的内容)。\\":匹配转义引号\"——这里的双反斜杠是因为正则本身会把反斜杠当作转义字符,所以需要额外转义一次。|: 逻辑“或”操作符。[^"]: 匹配任何不是普通双引号的单个字符。
*: 允许分组内容重复0次或多次(也能匹配空字符串)。": 匹配结尾的双引号。
Python使用示例
用你的源码测试一下这个正则:
import re source_code = '''def someStuff(): return "blabla" myThing = "Bob told me: \\"Hello there!\\"" twoStrings = "first part " + "second part"''' pattern = r'"(?:\\"|[^"])*"' # 获取所有完整匹配结果 matches = re.findall(pattern, source_code) print(matches)
运行后会输出你需要的所有目标字符串:
['"blabla"', '"Bob told me: \\"Hello there!\\""', '"first part "', '"second part"']
补充说明
- 如果你想捕获引号内部的内容(不带前后的
"),可以把模式改成带捕获分组的版本:"(\\|[^"])*",但此时findall会返回分组内的内容,而非完整的带引号字符串。 - 这个模式适用于基础的双引号Python字符串。如果需要处理单引号、三引号或者更复杂的转义序列(比如
\\后跟另一个反斜杠),需要扩展正则,但完全能满足你当前的需求。
内容的提问来源于stack exchange,提问作者Griffort
相关产品推荐
相关产品推荐

