我有以下文字:
#{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}']
有关如何改进当前正则表达式以满足我的需求的任何建议吗?
我想问题出在[^#]
...
答案 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]+\}')