正则表达式忽略搜索中的字符

时间:2012-03-13 21:04:14

标签: python mysql regex django

我有一个要求,我需要将“testuser”或“joeperson”等文本与“test.user”或“joe.person”等数据进行匹配。我不知道实际数据中传入搜索词的周期在哪里。简而言之,我们有 / cart / [可以有句点的用户名] / items / 这样的网址,我需要搜索与该模式匹配的所有用户名。

我正在使用Django和Python来对抗MySQL数据库。我知道我可以做一个像Django查询:

User.objects.filter(username__regex ='[some crazy pattern]')但这是我需要帮助的疯狂模式。

非常感谢!

3 个答案:

答案 0 :(得分:4)

使用如下的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 :(得分:1)

编辑更简洁地使用'?' vs'{0,1}'

当然,真正的问题是,将字段查找交给您的人/其他人没有正确地准备它,但是regEx并不一定比使用文字字符串循环整个集合慢得多。 / p>

RegEx匹配是连续的,因此您必须为'testuser'执行类似的操作,其中'。'字母之间的字符是可选的。这实际上并不是一个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社区没有发现两个字符串AND列表都有.join方法。

答案 2 :(得分:0)

尝试使用反斜杠来转义正则表达式中的句点,如下所示:

# This will work for test.user or joe.person
re.search('(\S+)\.(\S+)', 'test.user')