summaryrefslogtreecommitdiff
path: root/pyparsing/core.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyparsing/core.py')
-rw-r--r--pyparsing/core.py36
1 files changed, 27 insertions, 9 deletions
diff --git a/pyparsing/core.py b/pyparsing/core.py
index b51779f..ae7dcb6 100644
--- a/pyparsing/core.py
+++ b/pyparsing/core.py
@@ -3194,7 +3194,7 @@ class QuotedString(Token):
[['This is the "quote"']]
[['This is the quote with "embedded" quotes']]
"""
- ws_map = ((r"\t", "\t"), (r"\n", "\n"), (r"\f", "\f"), (r"\r", "\r"))
+ ws_map = dict(((r"\t", "\t"), (r"\n", "\n"), (r"\f", "\f"), (r"\r", "\r")))
def __init__(
self,
@@ -3244,6 +3244,7 @@ class QuotedString(Token):
self.escQuote: str = escQuote or ""
self.unquoteResults: bool = unquoteResults
self.convertWhitespaceEscapes: bool = convertWhitespaceEscapes
+ self.multiline = multiline
sep = ""
inner_pattern = ""
@@ -3292,6 +3293,17 @@ class QuotedString(Token):
]
)
+ if self.unquoteResults:
+ if self.convertWhitespaceEscapes:
+ self.unquote_scan_re = re.compile(
+ rf"({'|'.join(re.escape(k) for k in self.ws_map)})|({re.escape(self.escChar)}.)|(\n|.)",
+ flags=self.flags,
+ )
+ else:
+ self.unquote_scan_re = re.compile(
+ rf"({re.escape(self.escChar)}.)|(\n|.)", flags=self.flags
+ )
+
try:
self.re = re.compile(self.pattern, self.flags)
self.reString = self.pattern
@@ -3327,14 +3339,20 @@ class QuotedString(Token):
ret = ret[self.quoteCharLen : -self.endQuoteCharLen]
if isinstance(ret, str_type):
- # replace escaped whitespace
- if "\\" in ret and self.convertWhitespaceEscapes:
- for wslit, wschar in self.ws_map:
- ret = ret.replace(wslit, wschar)
-
- # replace escaped characters
- if self.escChar:
- ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret)
+ if self.convertWhitespaceEscapes:
+ ret = "".join(
+ self.ws_map[match.group(1)]
+ if match.group(1)
+ else match.group(2)[-1]
+ if match.group(2)
+ else match.group(3)
+ for match in self.unquote_scan_re.finditer(ret)
+ )
+ else:
+ ret = "".join(
+ match.group(1)[-1] if match.group(1) else match.group(2)
+ for match in self.unquote_scan_re.finditer(ret)
+ )
# replace escaped quotes
if self.escQuote: