python regex如何避免匹配多个分号?

Posted

技术标签:

【中文标题】python regex如何避免匹配多个分号?【英文标题】:python regex how to avoid match multiple semicolon? 【发布时间】:2015-05-03 11:11:07 【问题描述】:

我即将编写一个正则表达式来提取子字符串。字符串是:

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=.*;" 

但它会继续提取到 last 分号(包括+machineIdCookie=866873600),而不是我想要的 first 分号。

有没有办法只提取到第一个分号?而且我不能只通过“;”使用split因为这个正则表达式实际上是在Logstash配置文件中使用的,并且没有办法在那里使用python风格的编码......

【问题讨论】:

【参考方案1】:

你想让你的正则表达式不贪婪

而不是使用这个

*  - zero or more

使用这个

*? - zero or more (non-greedy)

这是你的表情 (demo)。

ObSSOCookie=(.*?;)

这是一种通用技术,在this answer 中也有描述。

【讨论】:

【参考方案2】:

除了像这样 (demo) 的下一个 ; 之外,为什么不抓任何东西

 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'

【讨论】:

以上是关于python regex如何避免匹配多个分号?的主要内容,如果未能解决你的问题,请参考以下文章

Impala find_in_set 用百分号匹配 LIKE

Python oneliner if 条件与多个语句用逗号和分号分隔

python百分号

语句的分号逗号和函数中var的使用

Python编写规则值得收藏

用sed和regex匿名化一些数据