diff --git a/CHANGES.txt b/CHANGES.txt
index 9463403..b5b406b 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -4,6 +4,7 @@
  * Fix CQL formatting of read command restrictions for slow query log (CASSANDRA-15503)
  * Allow sstableloader to use SSL on the native port (CASSANDRA-14904)
 Merged from 3.0:
+ * Backport CASSANDRA-12189: escape string literals (CASSANDRA-15948)
  * Avoid hinted handoff per-host throttle being arounded to 0 in large cluster (CASSANDRA-15859)
  * Avoid emitting empty range tombstones from RangeTombstoneList (CASSANDRA-15924)
  * Avoid thread starvation, and improve compare-and-swap performance, in the slab allocators (CASSANDRA-15922)
diff --git a/bin/cqlsh.py b/bin/cqlsh.py
index 44d4d50..f1b16cd 100644
--- a/bin/cqlsh.py
+++ b/bin/cqlsh.py
@@ -217,8 +217,7 @@
 parser.add_option("-f", "--file", help="Execute commands from FILE, then exit")
 parser.add_option('--debug', action='store_true',
                   help='Show additional debugging information')
-parser.add_option("--encoding", help="Specify a non-default encoding for output." +
-                  " (Default: %s)" % (UTF8,))
+parser.add_option("--encoding", help="Specify a non-default encoding for output. (Default: %s)" % (UTF8,))
 parser.add_option("--cqlshrc", help="Specify an alternative cqlshrc file location.")
 parser.add_option('--cqlversion', default=None,
                   help='Specify a particular CQL version, '
@@ -2406,8 +2405,8 @@
             # we silently ignore and fallback to UTC unless a custom timestamp format (which likely
             # does contain a TZ part) was specified
             if options.time_format != DEFAULT_TIMESTAMP_FORMAT:
-                sys.stderr.write("Warning: custom timestamp format specified in cqlshrc, but local timezone could not be detected.\n" +
-                                 "Either install Python 'tzlocal' module for auto-detection or specify client timezone in your cqlshrc.\n\n")
+                sys.stderr.write("Warning: custom timestamp format specified in cqlshrc, but local timezone could not be detected.\n"
+                                 + "Either install Python 'tzlocal' module for auto-detection or specify client timezone in your cqlshrc.\n\n")
 
     try:
         shell = Shell(hostname,
diff --git a/pylib/cqlshlib/copyutil.py b/pylib/cqlshlib/copyutil.py
index b91bb76..065fc83 100644
--- a/pylib/cqlshlib/copyutil.py
+++ b/pylib/cqlshlib/copyutil.py
@@ -1949,9 +1949,9 @@
             return ret
 
         # this should match all possible CQL and CQLSH datetime formats
-        p = re.compile("(\d{4})\-(\d{2})\-(\d{2})\s?(?:'T')?" +  # YYYY-MM-DD[( |'T')]
-                       "(?:(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{1,6}))?))?" +  # [HH:MM[:SS[.NNNNNN]]]
-                       "(?:([+\-])(\d{2}):?(\d{2}))?")  # [(+|-)HH[:]MM]]
+        p = re.compile(r"(\d{4})\-(\d{2})\-(\d{2})\s?(?:'T')?"  # YYYY-MM-DD[( |'T')]
+                       + r"(?:(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{1,6}))?))?"  # [HH:MM[:SS[.NNNNNN]]]
+                       + r"(?:([+\-])(\d{2}):?(\d{2}))?")  # [(+|-)HH[:]MM]]
 
         def convert_datetime(val, **_):
             try:
diff --git a/pylib/cqlshlib/cql3handling.py b/pylib/cqlshlib/cql3handling.py
index ae5bc8a..7709a26 100644
--- a/pylib/cqlshlib/cql3handling.py
+++ b/pylib/cqlshlib/cql3handling.py
@@ -461,8 +461,7 @@
 
 
 def cf_prop_name_completer(ctxt, cass):
-    return [c[0] for c in (CqlRuleSet.columnfamily_layout_options +
-                           CqlRuleSet.columnfamily_layout_map_options)]
+    return [c[0] for c in (CqlRuleSet.columnfamily_layout_options + CqlRuleSet.columnfamily_layout_map_options)]
 
 
 def cf_prop_val_completer(ctxt, cass):
@@ -864,9 +863,9 @@
 def regular_column_names(table_meta):
     if not table_meta or not table_meta.columns:
         return []
-    regular_columns = list(set(table_meta.columns.keys()) -
-                           set([key.name for key in table_meta.partition_key]) -
-                           set([key.name for key in table_meta.clustering_key]))
+    regular_columns = list(set(table_meta.columns.keys())
+                           - set([key.name for key in table_meta.partition_key])
+                           - set([key.name for key in table_meta.clustering_key]))
     return regular_columns
 
 
diff --git a/pylib/cqlshlib/formatting.py b/pylib/cqlshlib/formatting.py
index 9927aa1..d87e206 100644
--- a/pylib/cqlshlib/formatting.py
+++ b/pylib/cqlshlib/formatting.py
@@ -236,6 +236,7 @@
         return f
     return registrator
 
+
 class BlobType(object):
     def __init__(self, val):
         self.val = val
@@ -243,6 +244,7 @@
     def __str__(self):
         return str(self.val)
 
+
 @formatter_for('BlobType')
 def format_value_blob(val, colormap, **_):
     bval = '0x' + binascii.hexlify(val)
@@ -385,7 +387,7 @@
         return '%d' % (seconds * 1000.0)
 
 
-microseconds_regex = re.compile("(.*)(?:\.(\d{1,6}))(.*)")
+microseconds_regex = re.compile(r"(.*)(?:\.(\d{1,6}))(.*)")
 
 
 def round_microseconds(val):
diff --git a/pylib/cqlshlib/wcwidth.py b/pylib/cqlshlib/wcwidth.py
index 985fd41..096880a 100644
--- a/pylib/cqlshlib/wcwidth.py
+++ b/pylib/cqlshlib/wcwidth.py
@@ -252,19 +252,21 @@
     # if we arrive here, ucs is not a combining or C0/C1 control character
 
     return 1 + \
-        int(ucs >= 0x1100 and
-            (ucs <= 0x115f or                     # Hangul Jamo init. consonants
-             ucs == 0x2329 or ucs == 0x232a or
-             (ucs >= 0x2e80 and ucs <= 0xa4cf and
-              ucs != 0x303f) or                   # CJK ... Yi
-                (ucs >= 0xac00 and ucs <= 0xd7a3) or  # Hangul Syllables
-                (ucs >= 0xf900 and ucs <= 0xfaff) or  # CJK Compatibility Ideographs
-                (ucs >= 0xfe10 and ucs <= 0xfe19) or  # Vertical forms
-                (ucs >= 0xfe30 and ucs <= 0xfe6f) or  # CJK Compatibility Forms
-                (ucs >= 0xff00 and ucs <= 0xff60) or  # Fullwidth Forms
-                (ucs >= 0xffe0 and ucs <= 0xffe6) or
-                (ucs >= 0x20000 and ucs <= 0x2fffd) or
-                (ucs >= 0x30000 and ucs <= 0x3fffd)))
+        int(ucs >= 0x1100
+            and (ucs <= 0x115f  # Hangul Jamo init. consonants
+                 or ucs == 0x2329
+                 or ucs == 0x232a
+                 or (ucs >= 0x2e80
+                     and ucs <= 0xa4cf
+                     and ucs != 0x303f)  # CJK ... Yi
+                 or (ucs >= 0xac00 and ucs <= 0xd7a3)  # Hangul Syllables
+                 or (ucs >= 0xf900 and ucs <= 0xfaff)  # CJK Compatibility Ideographs
+                 or (ucs >= 0xfe10 and ucs <= 0xfe19)  # Vertical forms
+                 or (ucs >= 0xfe30 and ucs <= 0xfe6f)  # CJK Compatibility Forms
+                 or (ucs >= 0xff00 and ucs <= 0xff60)  # Fullwidth Forms
+                 or (ucs >= 0xffe0 and ucs <= 0xffe6)
+                 or (ucs >= 0x20000 and ucs <= 0x2fffd)
+                 or (ucs >= 0x30000 and ucs <= 0x3fffd)))
 
 
 def mk_wcswidth(pwcs):
