【发布时间】:2012-02-06 06:09:52
【问题描述】:
我有一个 Python 正则表达式,它接受一个字符串(数据库连接 URI)并使用命名组将其拆分为用户名、密码等。
uri = 'username:password@host/database'
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>[^\:@/]+)(\:(?P<port>[0-9]+))?/(?P<db>[^\?]+)?$').match(uri)
print m.groupdict()
{'host': 'host', 'password': 'password', 'db': 'database', 'user': 'username', 'port': None}
这很好用。问题是 uri 中是否有 @ 符号,因为它用于拆分密码和主机。例如,
uri = 'username:p@ssword@host/database'
将不匹配,这是预期的。但是,我希望能够转义特殊字符,例如:
uri = 'username:p\@ssword@host/database'
并让它匹配。我的正则表达式经验非常有限 - 我想我想做的是修改
(?P<password>[^@]*)
group 以便它匹配任何不是 @ 的字符,除非它前面有一个 \ 字符。当然,一些(大多数)连接字符串根本不包含 \@。
非常感谢任何帮助。
【问题讨论】:
-
为什么一开始就没有进行 URL 编码?
-
不确定,这不是我的代码。它实际上来自 web2py。无论如何,如果它是 URL 编码的,我会不会有同样的问题,即 @'s 被替换为 %40's?他们仍然需要逃跑..
-
不,因为正则表达式引擎不进行 URL 解码。