Регулярное выражение Python, как избежать совпадения нескольких точек с запятой?

Я собираюсь написать регулярное выражение для извлечения подстрок. строка выглядит так:

ASP.NET_SessionId=frffcjcarie4dhxouz5yklwu;+BIGipServercapitaliq-ssl=3617221783.36895.0000;+ObSSOCookie=wkyQfn2Cyx2%2f7kSj4zBB886WaLs92Ord9FSf64c%2byHFOBwgEP4f3UmorDj051suQwRXAKEwBtYVKRYJuUGh2YNZtAj2%2bNp8asLIT9xQPqVktEAzkl3jNIv8MyWFsoFPDtm%2fTm1FeaCP%2bGTk9Oa%2fCNA0Hmy847qK2qo7%2bbziV%2bjeClbkGjAX3pgcPzfs%2bQp7p9BSjP1xJqUaUKwJ2%2flIgzZL5Ma%2bnJK8j%2b732ixNyIDNDGo7uIF%2b;+machineIdCookie=866873600;+userLoggedIn=jga;sdgjefdfdfs

Персонал, который я хочу извлечь, это только "ObSSOCookie=....;" перед "userLoggedIn", потому что это информация о сеансе, которая мне нужна и полезна.

Дело в том, что я установил свой шаблон регулярных выражений

pattern = "ObSSOCookie=.*;" 

Но он продолжает извлекать, который включает "+machineIdCookie=866873600", который я хочу отбросить. Кажется, так как есть ";" в моем регулярном выражении он продолжает извлекать, пока не найти ни одного. Есть ли способ просто извлечь первый? И я не могу просто использовать "разделить" на ";" потому что это регулярное выражение фактически используется в файле конфигурации "Logstash", и там нет никакого способа использовать кодирование в стиле Python...

Спасибо

2 ответа

Решение

Почему бы просто не взять что-нибудь, кроме следующего ; как это ( демо)

 ObSSOCookie=([^;]*)


>>> import re
>>> data = 'ASP.NET_SessionId=frffcjcarie4dhxouz5yklwu;+BIGipServercapitaliq-ssl=3617221783.36895.0000;+ObSSOCookie=wkyQfn2Cyx2%2f7kSj4zBB886WaLs92Ord9FSf64c%2byHFOBwgEP4f3UmorDj051suQwRXAKEwBtYVKRYJuUGh2YNZtAj2%2bNp8asLIT9xQPqVktEAzkl3jNIv8MyWFsoFPDtm%2fTm1FeaCP%2bGTk9Oa%2fCNA0Hmy847qK2qo7%2bbziV%2bjeClbkGjAX3pgcPzfs%2bQp7p9BSjP1xJqUaUKwJ2%2flIgzZL5Ma%2bnJK8j%2b732ixNyIDNDGo7uIF%2b;+machineIdCookie=866873600;+userLoggedIn=jga;sdgjefdfdfs'
>>> p = re.compile('ObSSOCookie=([^;]*)')
>>> m = p.search(data)
>>> m.group(1)
'wkyQfn2Cyx2%2f7kSj4zBB886WaLs92Ord9FSf64c%2byHFOBwgEP4f3UmorDj051suQwRXAKEwBtYVKRYJuUGh2YNZtAj2%2bNp8asLIT9xQPqVktEAzkl3jNIv8MyWFsoFPDtm%2fTm1FeaCP%2bGTk9Oa%2fCNA0Hmy847qK2qo7%2bbziV%2bjeClbkGjAX3pgcPzfs%2bQp7p9BSjP1xJqUaUKwJ2%2flIgzZL5Ma%2bnJK8j%2b732ixNyIDNDGo7uIF%2b'

Вы хотите сделать свое регулярное выражение нежадным

Вместо того, чтобы использовать это

*  - zero or more

Использовать этот

*? - zero or more (non-greedy)

Вот ваше выражение ( демо).

ObSSOCookie=(.*?;)

Это общая техника, также описанная в этом ответе.

Другие вопросы по тегам