我有Django模型,在其中一个字段中我需要存储一个我将在以后使用的正则表达式字符串:
class Foo(models.Model):
name = models.CharField(max_length=30, unique=True)
regex_string = models.TextField()
例如,regex_string字段可能设置为:
r'\d{2}'
然后我尝试稍后检索它,将其编译为正则表达式并使用它 - 但是,它似乎没有按计划工作:
>>> pattern = re.compile(ham.regex_string)
>>> print(pattern.match("22"))
None
显然,如果我直接传递原始字符串文字,它可以正常工作:
>>> pattern = re.compile(r'\d{2}')
>>> pattern.match("22")
<_sre.SRE_Match object at 0x1505100>
如果我实际打印ham.regex_string,则返回:
u"r'\\d{2}'"
所以它是一个unicode字符串,但由于某种原因,反斜杠是双倍的?有没有更好的方法在Django模型中存储正则表达式模式,所以我以后可以使用它?
干杯, 维克多
编辑:感谢大家的回答=)。我已经给了rczajka的答案,因为他是第一部分职位(至少如果相信StackOverflow时间戳)。为了清楚起见,用户在表单(django-admin)上输入了该字段。以前,他们使用 r''
进入正则表达式 - 例如r'\d{2}\
。但是,如果我让它们进入字符串文字本身\d{2}
,它现在似乎工作 - Django不会篡改字符串,或解释反斜杠 - 没有理由它,对吧?
答案 0 :(得分:2)
检索后你需要更加聪明。
>>> import ast
>>> print ast.literal_eval(u"r'\\d{2}'")
\d{2}
答案 1 :(得分:1)
呃,不要存储文字(即"r'\d{2}'"
),存储它产生的内容。
foo = Foo.objects.create(regex_string = r'\d{2}')
foo_re = re.compile(foo.regex_string)
答案 2 :(得分:0)
这是一个非常奇怪的错误。 Python原始字符串只是语法上的便利(它评估为常规字节字符串),所以我看不出如何获得u"r'\\d{2}"
。我能想到的只是你以某种方式在文字周围写了双引号,这不是一个可能的错误。
当我跑步时
from someproject.someapp.models import *
ham = Foo(name=u'test', regex_string=r'\d{2}')
ham.save()
ham = Foo.objects.get(name=u'test')
print ham.regex_string
在manage.py shell
中的,我得到了Unicode字符串\d{2}
(正如预期的那样)。
你说你打印过ham.regex_string
,但看起来你实际上只是在Python交互式控制台中对它进行了评估。这会给出一个对象repr
,在这种情况下为u'\\d{2}'
。加倍\\
仅供展示;该字符串实际上包含一个\
。
另外:你真的使用正则表达式来匹配二进制字符串吗?如果没有,您应该使用Unicode正则表达式ur'\d{2}'
。如果你是,你应该明确地对你的正则表达式进行Base64编码,因为一般来说二进制正则表达式不是有效的UTF-8,因此不会在数据库中正确存储。
答案 3 :(得分:0)
如何设置regex_string字段?你是否可以在页面上输入内容? r''
符号仅仅是语法糖:
>>> r'\d{2}'
'\\d{2}'
>>> print r'\d{2}'
\d{2}
因此,如果您想在输入中放置内容,请编写实际的正则表达式字符串(\d{2}
),而不是Python文字。