用于组合前瞻/后视的正则表达式

时间:2014-01-02 22:15:40

标签: python regex

我正在使用python并尝试编写一个匹配连字符( - )的正则表达式,如果它没有句点(。),并且后面没有一个字符和句点。

这个匹配的连字符前面没有句点,后面没有字符:

r'(?<!\.)(-(?![a-zA-Z]))'

我尝试过的任何东西似乎都没有让我得到正面匹配的负面预测部分(单个字符和句号)。

任何帮助表示赞赏。如果我完全咆哮错误的树,即使是完全不同的正则表达式。

修改

感谢您的回答。我确实试过了

r'(?<!\.)(-(?![a-zA-Z]\.))'

但我现在意识到我的逻辑错了,而不是我的表达。

我选择了答案并赞成其他正确答案:)

2 个答案:

答案 0 :(得分:2)

假设你的意思是“字符”(我将这个假设建立在你的例子和@ SimonO101的评论上)[A-Za-z],我认为你正在寻找这样的事情:

>>> r = re.compile(r'(?<!\.)-(?![A-Za-z]\.)')
>>> r.search('k.-kj')
>>> r.search('k-l.')
>>> r.search('k-ll')
<_sre.SRE_Match object at 0x02D46758>
>>> r.search('k-.l')
<_sre.SRE_Match object at 0x02D46720>
>>> r.search('l-..')
<_sre.SRE_Match object at 0x02D46758>

没有必要尝试将连字符括在一个也捕获负前瞻断言的组中。试图做到这一点只会使事情复杂化。

答案 1 :(得分:1)

import re

ss = '  a-bc1    d-e.2    .-gh3    .-N.4'
print 'The analysed string:\n',ss

print '\n(?!\.-[a-zA-Z]\.)'
print 'NOT (preceded by a dot AND followed by character-and-dot)'
r = re.compile('(?!\.-[a-zA-Z]\.).-...')
print r.findall(ss)

print '\n(?<!\.)-(?![a-zA-Z]\.)'
print 'NOT (preceded by a dot OR followed by character-and-dot)'
q = re.compile('.(?<!\.)-(?![a-zA-Z]\.)...')
print q.findall(ss)

结果

The analysed string:
  a-bc1    d-e.2    .-gh3    .-N.4

(?!\.-[a-zA-Z]\.)
NOT (preceded by a dot AND followed by character-and-dot)
['a-bc1', 'd-e.2', '.-gh3']

(?<!\.)-(?![a-zA-Z]\.)
NOT (preceded by a dot OR followed by character-and-dot)
['a-bc1']

您实际上想要哪种情况?