2014-09-11 4 views
1

Я программирую парсер URL, чтобы получить некоторые значения, чтобы сделать некоторые статистические данные. Например, я хочу, чтобы разобрать только имя пользователя:regex - Как сделать необязательным конец строки

uSSer=andoni&password=contra 

(я только хочу, чтобы получить значение uSSer или некоторое вероятное поле из URL), и им, используя регулярное выражение:

.*?[u,U][s,S][e,E][r,R].*?=(.*)& 

It работает, если параметр uSSer находится перед токеном & по URL-адресу, но если это последнее поле из URL-адреса? Например:

parameter1=foo&password=contra&uSSer=andoni 
+0

У вас есть '. *?' Между 'us' и' er'. Вы собираетесь на этот матч 'us = foo & er = bar'? Пожалуйста, будьте более конкретными относительно ваших требований. –

+3

Используйте [парсер URL] (http://devdocs.io/python/library/urllib.parse#urllib.parse.urlparse) – hjpotter92

+0

Это [как] (http://hg.python.org/cpython/file/ 2.7/Lib/urlparse.py # l390) Python решает его. Это хороший пример: «regex теперь у меня две проблемы». –

ответ

1

Ваше регулярное выражение выглядит довольно забавным для меня. Я удалил .*? и ,.

(^|&)[uU][sS][sS][eE][rR]=([^&]*) 

Он начинается либо с & или ничего. И пользователь до тех пор, пока не будет найден амперсанд.

Вы можете проверить его здесь: http://regex101.com/r/wI5oX2/1

0

Put в классе все, что вы хотите использовать для разделителей.
Это работает только в том случае, если Python поддерживает lookbehinds.
Если вы намерены не учитывать регистр, поместите (?i) в начало регулярного выражения.
Или, если Python не поддерживает встроенные модификаторы, поместите его как функцию.
Если это не поддерживается, используйте [aA], как вы это делаете.

# (?<=[&/?\r\n])uSSer=([^&/?\r\n]+) 

(?<= [&/?\r\n]) 
uSSer= 
([^&/?\r\n]+)  # (1) 
Смежные вопросы