我正在使用python并尝试编写一个匹配连字符( - )的正则表达式,如果它没有句点(。),并且后面没有一个字符和句点。
这个匹配的连字符前面没有句点,后面没有字符:
r'(?<!\.)(-(?![a-zA-Z]))'
我尝试过的任何东西似乎都没有让我得到正面匹配的负面预测部分(单个字符和句号)。
任何帮助表示赞赏。如果我完全咆哮错误的树,即使是完全不同的正则表达式。
修改
感谢您的回答。我确实试过了
r'(?<!\.)(-(?![a-zA-Z]\.))'
但我现在意识到我的逻辑错了,而不是我的表达。
我选择了答案并赞成其他正确答案:)
答案 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']
您实际上想要哪种情况?