Регулярное выражение 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=(.*?;)
Это общая техника, также описанная в этом ответе.