在字符串中查找子字符串的位置

16

我有一个Python字符串格式化的问题

mystr = "hi.this(is?my*string+"
我需要获取被特殊字符或非字母字符(即示例中第二个“is”)所包围的“is”的位置。但是,使用...
mystr.find('is')

如果与“this”相关联的“is”将被返回,这是不希望的。如何在字符串中查找被非字母字符包围的子字符串的位置?使用Python 2.7

1个回答

16

最好的选择是使用正则表达式。Python有 re 模块 用于处理正则表达式。

我们使用简单的搜索来找到 "is" 的位置:

>>> match = re.search(r"[^a-zA-Z](is)[^a-zA-Z]", mystr)

这将返回第一个匹配项作为匹配对象。然后我们只需使用MatchObject.start()来获取起始位置:

>>> match.start(1)
8

编辑:一个很好的观点是,我们将"is"作为一组,并匹配该组以确保得到正确的位置。

正如评论中指出的那样,这里做了一些假设。其中之一是surrounded表示"is"不能在字符串的开头或结尾,如果是这种情况,则需要使用不同的正则表达式,因为这只匹配了被包围的字符串。

另一个假设是计数数字作为特殊字符 - 您已经说明non-alphabetic,我认为这意味着包括数字。如果您不想计算数字,则使用r"\b(is)\b"是正确的解决方案。


re.search(r'\bis\b') - 否则你会匹配前面的符号,位置就不对了。 - georg
@thg435 问问题的人说的是非字母而不是非字母数字,所以\b不起作用 - 但是关于位置错误的好点子,我没有注意到,已经修复了。 - Gareth Latty
此外,您的表达式在开头/结尾无法匹配。您仍然需要在这里使用环视。 - georg
我不会太依赖他们所“说”的内容。像通常在SO上一样,这个问题很模糊和混乱,作为回答者,你的工作就是猜测(或询问)他们实际上想要实现什么。 - georg
@thg435 我添加了一些澄清,但我会回答给出的问题。如果提问者需要其他东西,他们必须让问题更清晰明了。 - Gareth Latty
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接