在句子中查找单词的开始和结束偏移量(后面跟着多个标点符号)

2024-09-30 01:22:22 发布

您现在位置:Python中文网/ 问答频道 /正文

text = 'how much are you pledging to spend on education?!'

p = re.compile('education?!')

print p.search(text)

None

但为什么呢?一个单词后面有多个标点符号,这让搜索变得不起作用,这有什么特别之处??我不明白:(


Tags: totextrenoneyousearchonare
3条回答

?是regex中的一个特殊字符,意思是“可选地匹配前面的规则”。在本例中,它可以选择匹配“n”,这很好,但是下一个字符应该是“!”。在

相反,请避开“?”在正则表达式中。现在匹配“?”而不是扮演一个特殊的角色。在

p = re.compile('education\?!')

docs on the ^{} module解释了这一点。在

既然您似乎不了解正则表达式,因此不太可能真正想要/需要它们,我可以建议您这样做吗?在

>>> text = 'how much are you pledging to spend on education?!'
>>> needle = 'education?!'
>>> start = text.index(needle)
>>> end = start + len(needle)
>>> start, end
(38, 49)

但我真正想知道的是你为什么要开始和结束索引。例如,如果您希望它们替换子字符串,有一种更好的方法:

^{pr2}$

如果您有想要逐字匹配的元字符,您应该使用re.escape来帮助您通过在所有非字母数字前面加一个\来对它们进行转义:

>>> text = 'how much are you pledging to spend on education?!'
>>> pat=re.escape(r'education?!')
>>> pat
'education\\?\\!'
>>> p=re.compile(pat)
>>> p.search(text)
<_sre.SRE_Match object; span=(38, 49), match='education?!'>

这允许您转义未知元字符:

^{pr2}$

关于python3.4re上的backslash plague有一个很好的讨论HOWTO


根据评论:

>>> m=p.search(text)
>>> m.span()
(38, 49)
>>> text[38:49]
'education?!'
>>> text[slice(*m.span())]
'education?!'

相关问题 更多 >

    热门问题