Regex для игнорирования символа в поиске - PullRequest
2 голосов
/ 14 марта 2012

У меня есть требование, когда мне нужно сопоставить текст, такой как «testuser» или «joeperson», с данными, такими как «test.user» или «joe.person».Я не буду знать, где находится период во входящем поисковом запросе в фактических данных.Короче говоря, у нас есть URL-адреса, такие как / cart / [имя пользователя, которое может иметь точку] / items / , и мне нужно найти все имена пользователей, соответствующие этому шаблону.

IЯ использую Django и Python против базы данных MySQL.Я знаю, что могу выполнить запрос Django, например:

User.objects.filter (username__regex = '[некоторый сумасшедший шаблон]'), но это сумасшедший шаблон, с которым мне нужна помощь.

Спасибостолько!

Ответы [ 3 ]

4 голосов
/ 14 марта 2012

Используйте SQL-запрос, подобный следующему:

SELECT * FROM users WHERE REPLACE(username, '.', '') = 'username_without_dots'

Или в Django:

normalized_name = searchterm.replace('.', '')
User.objects.raw('SELECT * FROM user WHERE '
                 'REPLACE(username, '.', '') = %s', 
                 [normalized_name])
1 голос
/ 14 марта 2012

Отредактировано для более краткого использования '?'vs '{0,1}'

Реальная проблема, конечно, в том, что тот, кто / что бы ни передавал вам поиск полей, не подготовил его должным образом, но regEx не обязательно будет намного медленнеечем зацикливание всей коллекции литеральной строкой.

Соответствие RegEx является последовательным, поэтому вам придется сделать что-то подобное для 'testuser' where '.'символы между буквами необязательны.Это на самом деле не так уж и медленно для regEx, так как он должен потерпеть неудачу, как только символ не будет совпадать, и все символы явные, поэтому вы не используете массивный индекс для каждого символа.

r'^t\.?e\.?s\.?t\.?u\.?s\.?e\.?r$'

Важна часть пространства между вашими обычными персонажами.Для> = 0 '.'символы, которые вы могли бы сделать. * и, конечно, я предполагаю, что нет периодов начала или конца.Если вы можете объединить, вы сможете справиться с этим.

Чтобы создать первый regEx, я бы сделал что-то вроде:

user = user.split('')
userRegEx = '\.?'.join(user)

#not sure I have the right syntax for the Django arg

User.objects.filter(username__regex=r'^'+userRegEx+'$')

Как парень из JS, я должен сказать, что я 'Я немного озадачен тем, почему сообществу Python не пришло в голову, что обе строки и списки могут иметь метод .join.

0 голосов
/ 14 марта 2012

Попробуйте использовать обратную косую черту для экранирования точки в регулярном выражении, например:

# This will work for test.user or joe.person
re.search('(\S+)\.(\S+)', 'test.user')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...