我有一个要求,我需要将“testuser”或“joeperson”等文本与“test.user”或“joe.person”等数据进行匹配。我不知道实际数据中传入搜索词的周期在哪里。简而言之,我们有 / cart / [可以有句点的用户名] / items / 这样的网址,我需要搜索与该模式匹配的所有用户名。
我正在使用Django和Python来对抗MySQL数据库。我知道我可以做一个像Django查询:
User.objects.filter(username__regex ='[some crazy pattern]')但这是我需要帮助的疯狂模式。
非常感谢!
答案 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')