.. versionadded:: 1.4
Support for the :meth:`_sql.ColumnOperators.regexp_match` operator is provided
-using Python's re.match_ function. SQLite itself does not include a working
+using Python's re.search_ function. SQLite itself does not include a working
regular expression operator; instead, it includes a non-implemented placeholder
operator ``REGEXP`` that calls a user-defined function that must be provided.
def regexp(a, b):
- return bool(re.match(a, b))
+ return re.search(a, b) is not None
sqlite_connection.create_function(
"regexp", 2, regexp,
.. _create_function: https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.create_function
-.. _re.match: https://docs.python.org/3/library/re.html#re.match
+.. _re.search: https://docs.python.org/3/library/re.html#re.search
-.. _Python regular expressions: https://docs.python.org/3/library/re.html#re.match
+.. _Python regular expressions: https://docs.python.org/3/library/re.html#re.search
def regexp(a, b):
if b is None:
return None
- return bool(re.match(a, b))
+ return re.search(a, b) is not None
def set_regexp(connection):
if hasattr(connection, "connection"):
self._test(col.contains("b%cd", autoescape=True, escape="#"), {3})
self._test(col.contains("b#cd", autoescape=True, escape="#"), {7})
- @testing.requires.regexp_match
- def test_regexp_match(self):
- col = self.tables.some_table.c.data
- self._test(col.regexp_match("a.cde"), {1, 5, 6, 9})
-
@testing.requires.regexp_match
def test_not_regexp_match(self):
col = self.tables.some_table.c.data
col.regexp_replace("a.cde", "FOO").contains("FOO"), {1, 5, 6, 9}
)
+ @testing.requires.regexp_match
+ @testing.combinations(
+ ("a.cde", {1, 5, 6, 9}),
+ ("abc", {1, 5, 6, 9, 10}),
+ ("^abc", {1, 5, 6, 9, 10}),
+ ("9cde", {8}),
+ ("^a", set(range(1, 11))),
+ ("(b|c)", set(range(1, 11))),
+ ("^(b|c)", set()),
+ )
+ def test_regexp_match(self, text, expected):
+ col = self.tables.some_table.c.data
+ self._test(col.regexp_match(text), expected)
+
class ComputedColumnTest(fixtures.TablesTest):
__backend__ = True