У меня есть регулярное выражение Python, который принимает строку (соединение с базой данных URI) и расщепляет его, используя именованные группы в имя пользователя, пароль и т.д.Python Regex - Спасаясь
uri = 'username:[email protected]/database'
m = re.compile('^(?P<user>[^:@]+)(\:(?P<password>[^@]*))[email protected](?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:[email protected]@host/database'
не будет соответствовать, что ожидается. Тем не менее, я хотел бы уйти от особого характера, например:
uri = 'username:p\@[email protected]/database'
и иметь это соответствие. Мой опыт регулярных выражений довольно ограничен - я думаю, что я хотел бы сделать, это изменить группу
(?P<password>[^@]*)
так, что он будет соответствовать любому символу, который не является @, если это не предшествует символ \. Конечно, некоторые (большинство) строк соединения не будут содержать \ @ вообще.
Любая помощь очень ценится.
Почему это не URL-кодирование в первую очередь? –
Не уверен, это не мой код изначально. Это от web2py. Во всяком случае, не будет ли у меня такая же проблема, если бы она была закодирована в URL, т. Е. @ Были заменены на% 40? Им все равно нужно ускользнуть. – Caligari
Нет, поскольку механизм регулярных выражений не преобразует URL-адреса. –