匹配除了单词之外的任何东西,正则表达式问题

时间:2013-04-29 22:38:26

标签: python regex python-2.7

鉴于这个凌乱的字符串:

66,"Hi":"11.00","sth":"187,"Hi":"13.00"[5]"53","target":{"sth2"

我希望匹配13.00sth2(我需要忽略Hi的{​​{1}}值。

我的正则表达式11.00无法执行此操作,因为它与"Hi":"(.{0,5})".+"target":{"(.*)"的最左侧值匹配,此处为:Hi

我正在寻找能够禁止11.00本身与单词Hi之间存在Hi字的解决方案。

1 个答案:

答案 0 :(得分:5)

尝试将正则表达式更改为以下内容:

"Hi":"(.{0,5})"(?:(?!"Hi").)+"target":{"(.*)"

此处唯一的区别是将.+更改为(?:(?!"Hi").)+。如果下一个字符为(?!"Hi"),则"Hi"是否定前瞻,如果将.置于重复之前,则会确保不会出现该字符串的匹配作为.+

的一部分

示例:

>>> regex = re.compile(r'"Hi":"(.{0,5})"(?:(?!"Hi").)+"target":{"(.*)"')
>>> text = '66,"Hi":"11.00","sth":"187,"Hi":"13.00"[5]"53","target":{"sth2"'
>>> regex.search(text).groups()
('13.00', 'sth2')

这是将这种类型的需求添加到正则表达式的一种很好的通用方法,但在您的情况下,您也可以在当前正则表达式的开头添加.*。这将在字符串的开头贪婪地匹配尽可能多的字符,因此您将匹配"Hi"最右边的字符。