3

我正在尝试编写一个 Django 查询,该查询将按特定的正则表达式模式进行过滤。

我想通过一个代码进行过滤,该代码会提取出任何非数字字符后跟一个数字,然后是一个非数字字符(空格很好)的情况。

只是说一些代码是AJDP8EP, jsif28EP, EROE88, oskdpoeks8.

所以我希望我的结果返回:AJDP8EP, oskdpoeks8.

这是我的查询,但它没有正确识别事物。数字是一个变量。

results = Book.objects.filter(author__contains = firstname,type = "Fiction").filter(code__regex = r'^(\D+)(number)(\D+)')
4

2 回答 2

2

您不能在引用的正则表达式中使用变量。尝试连接字符串,例如:

r"^(\D+)(" + str(number) + ")(\D+)"

这会将您的number变量转换为字符串以防万一。

此外,正如您对问题的评论之一所述,oskdpoeks8与您的模式不匹配。如果您想捕获number代码末尾可能出现的情况,一种解决方案是:

r"^(\D+)(" + str(number) + ")(\D*)"

+请注意用 an替换*以捕获零出现的情况。

于 2013-09-22T00:19:03.197 回答
0

使用 django 上的 python 3+ 和更新版本,您可以使用 f-strings 将变量传递给正则表达式并在查询中使用它们。例如:

Car.objects.filter(
    car_code__regex=rf'^{settings.SOME_SETTING}0*(\d+)$'
)

对于 OP 的情况:

results = Book.objects.filter(author__contains = firstname,type = "Fiction").filter(code__regex = rf'^(\D+){number}(\D+)')
于 2021-12-10T19:11:52.263 回答