2016-05-18 3 views
1

Я хочу извлечь UUID из URL-адресов.extract uuid from url

, например:?

/сообщений/eb8c6d25-8784-4cdf-b016-4d8f6df64a62 mc_cid = 37387dcb5f & mc_eid = 787bbeceb2
/сообщений/d78fa5da-4cbb-43b5-9fae-2b5c86f883cb/UID/7034
/сообщений/5ff0021c-16cd-4f66-8881-ee28197ed1cf

у меня есть тысячи такого рода строки.

Моя регулярное выражение теперь ".*\/posts\/(.*)[/?]+.*" , который дает мне результат:

d78fa5da-4cbb-43b5-9fae-2b5c86f883cb/UID
84ba0472-926d-4f50-b3c6-46376b2fe9de/UID
6f3c97c1-b877-40e0-9479-6bdb826b7b8f/UID
f5e5dc6a-F42B-47d1-8ab1-6ae533415d24
f5e5dc6a-F42B-47d1-8ab1-6ae533415d24
f7842dce-73a3-4984-bbb0-21d7ebce1749
fdc6c48f-b124-447d-b4fc-bb528abb8e24

Как вы можете видеть, мой регулярное выражение не может избавиться от /uid, но обрабатывать ?xxxx, параметр запроса, хорошо.

Что я пропустил? Как все исправить?

Благодаря

+0

Вы сначала попробовали поиск? http://stackoverflow.com/questions/136505/searching-for-uuids-in-text-with-regex и http://stackoverflow.com/questions/7905929/how-to-test-valid-uuid-guid – fukanchik

+0

хорошие указатели. Я искал неправильные ключевые слова. @fukanchik –

ответ

3

.* картина слишком широки и жадный для UUID:

>>> import re 
>>> data = """ 
... /posts/eb8c6d25-8784-4cdf-b016-4d8f6df64a62?mc_cid=37387dcb5f&mc_eid=787bbeceb2 
... /posts/d78fa5da-4cbb-43b5-9fae-2b5c86f883cb/uid/7034 
... /posts/5ff0021c-16cd-4f66-8881-ee28197ed1cf 
... """ 
>>> 
>>> re.findall(r"/posts/([A-Za-z0-9\-]+)", data) 
['eb8c6d25-8784-4cdf-b016-4d8f6df64a62', 
'd78fa5da-4cbb-43b5-9fae-2b5c86f883cb', 
'5ff0021c-16cd-4f66-8881-ee28197ed1cf'] 

Или, вы можете быть более строгим о формате UUID, смотрите:

+0

большое спасибо! прямо к точке –

2

Регулярные выражения пытаются сопоставить как можно больше символов (неофициально называемых «максимальным жеванием»).

Равнина-английский Описание вашего регулярного выражения .*\/posts\/(.*)[/?]+.* будет что-то вроде:

матча ничего, а затем /posts/, после чего-либо, а затем один или более /?, а затем что-нибудь.

Когда мы применяем это регулярное выражение к этому тексту:

.../posts/d78fa5da-4cbb-43b5-9fae-2b5c86f883cb/uid/7034

...максимальное правило жуют требует, чтобы второй «ничего» матч будет как можно дольше, поэтому он заканчивает тем, что соответствие больше, чем вы хотели:

d78fa5da-4cbb-43b5-9fae-2b5c86f883cb/uid

... потому что есть еще /7034 часть оставшихся, которые совпадает с остальной частью регулярного выражения.

Лучший способ исправить это - использовать регулярное выражение, которое только соответствует символам, которые могут встречаться в UID (как предложено @alecxe).

+0

спасибо за ваше объяснение! –