From 7ff26dbb355461ac707ac30e3770d9d32ed5ad02 Mon Sep 17 00:00:00 2001 From: Guewen Baconnier Date: Tue, 4 Mar 2014 14:19:28 +0100 Subject: [PATCH] [FIX] too many characters are escaped, leading to an 'invalid regular expression: invalid escape \ sequence' error. Escape only the list of characters that must be escaped according to POSIX-ARE --- account_statement_base_completion/statement.py | 10 ++++++++-- .../tests/test_base_completion.py | 2 ++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/account_statement_base_completion/statement.py b/account_statement_base_completion/statement.py index 61e3dbde..dc5ca7fd 100644 --- a/account_statement_base_completion/statement.py +++ b/account_statement_base_completion/statement.py @@ -319,9 +319,15 @@ class AccountStatementCompletionRule(orm.Model): if not context['partner_memoizer']: return res st_obj = self.pool.get('account.bank.statement.line') - # regexp_replace(name,'([^a-zA-Z0-9 -])', '\\\1', 'g'), 'i') escape the column name to avoid false positive. (ex 'jho..doe' -> 'joh\.\.doe' + # The regexp_replace() escapes the name to avoid false positive + # example: 'John J. Doe (No 1)' is escaped to 'John J\. Doe \(No 1\)' + # See http://stackoverflow.com/a/400316/1504003 for a list of + # chars to escape. Postgres is POSIX-ARE, compatible with + # POSIX-ERE excepted that '\' must be escaped inside brackets according to: + # http://www.postgresql.org/docs/9.0/static/functions-matching.html + # in chapter 9.7.3.6. Limits and Compatibility sql = """SELECT id FROM ( - SELECT id, regexp_matches(%s, regexp_replace(name,'([^[:alpha:]0-9 -])', %s, 'g'), 'i') AS name_match FROM res_partner + SELECT id, regexp_matches(%s, regexp_replace(name,'([\.\^\$\*\+\?\(\)\[\{\\\|])', %s, 'g'), 'i') AS name_match FROM res_partner WHERE id IN %s) AS res_patner_matcher WHERE name_match IS NOT NULL""" cr.execute(sql, (st_line['name'], r"\\\1", context['partner_memoizer'])) diff --git a/account_statement_base_completion/tests/test_base_completion.py b/account_statement_base_completion/tests/test_base_completion.py index d9416eff..6e2d8d3e 100644 --- a/account_statement_base_completion/tests/test_base_completion.py +++ b/account_statement_base_completion/tests/test_base_completion.py @@ -36,6 +36,8 @@ NAMES_COMPLETION_CASES = [ name_completion_case("A.one SA", "A.one SA for line", True), name_completion_case("Acsone SA", "Line for Acsone ([^a-zA-Z0-9 -]) SA test", False), name_completion_case("Acsone ([^a-zA-Z0-9 -]) SA", "Line for Acsone ([^a-zA-Z0-9 -]) SA test", True), + name_completion_case(r"Acsone (.^$*+?()[{\| -]\) SA", r"Line for Acsone (.^$*+?()[{\| -]\) SA test", True), + name_completion_case("Acšone SA", "Line for Acšone SA test", True), ]