检索#{}内的文本

时间:2011-08-19 11:54:33

标签: python regex

我有以下文字:

#{king} for a ##{day}, ##{fool} for a #{lifetime}

以下(破损)正则表达式:

[^#]#{[a-z]+}

我希望匹配所有#{words}但不匹配## {words}(加倍'#'就像转义一样)。

今天我注意到我的正则表达式忽略了第一个单词(拒绝匹配#{king},但正确地忽略## {day}和## {fool})。

>>> regex = re.compile("[^#]#{[a-z]+}")
>>> regex.findall(string)
[u' #{lifetime}']

有关如何改进当前正则表达式以满足我的需求的任何建议吗? 我想问题出在[^#] ...

5 个答案:

答案 0 :(得分:6)

你必须使用“负面的lookbehind断言”,正确的正则表达式看起来像这样:

import re
t = "#{king} for a ##{day}, ##{fool} for a #{lifetime}"
re.findall(r'(?<!#)#{([a-z]+)}', t)

返回

['king', 'lifetime']

<强>解释

(?<!prefix)pattern表达式仅在pattern之前不匹配prefix

答案 1 :(得分:2)

使用后视构造:

>>> s='#{king} for a ##{day}, ##{fool} for a #{lifetime}'
>>> r=re.compile(r'(?:^|(?<=[^#]))#{\w+}')
>>> r.findall(s)
['#{king}', '#{lifetime}']
>>>

答案 2 :(得分:2)

>>> regex = re.compile("(?:^|[^#])#{[a-z]+}")
>>> regex.findall(string)
['#{king}', ' #{lifetime}']
>>>

答案 3 :(得分:1)

将其替换为(?:^|[^#])。就像你推断的那样,只有[^#]表示一个不是#的字符,显然不存在于行的开头。

答案 4 :(得分:0)

试试这个:

re.compile('^#\{[\w]+\}')