正则表达式问题?

时间:2015-04-14 17:37:27

标签: python

我很难理解正则表达式模式。有人可以帮助我正则表达式模式匹配所有以s结尾的单词。并以a开头并以(如ana)结束。 我怎么写结尾?

2 个答案:

答案 0 :(得分:2)

单词边界由\b给出,因此以下正则表达式匹配以ing或s结尾的单词:"\b(\w+?(?:ing|s))\b"其中\b是单词边界,\w+是一个或更多“单词字符”和(?:ing|s)是一个未被捕获的ings组。

当你问“如何开发正则表达式”时:

首先:不要将regex用于复杂的任务。它们难以阅读,编写和维护。例如,有a regex that validates email addresses - 但它的计算机是生成的,在实践中你不应该使用它。

开始简单并添加边缘案例。在开始时计划您需要使用的字符:您说您需要以sing结尾的单词。所以你可能需要一些东西来表示一个单词,单词的结尾以及文字字符sing。什么是单词?这可能会因情况而异,但至少每个字母字符都会发生变化。查看python documentation on regexes \w[a-zA-Z0-9_] \b,这符合我对单词字符的印象。在那里你还可以找到\b\w...\w\b这是一个单词边界。

所以“第一个伪代码尝试”就像...匹配一个单词。我们仍然需要“正式化”\b\w+\b我们想要具有“一个或多个字符”的含义,这直接转换为s。我们现在可以匹配一个字!我们仍然需要ing|\b\w+ing|s\b转换为或,以下内容如何:ingest?如果您对此进行测试,您会发现它会匹配|等令人困惑的内容,这些内容与我们的正则表达式不匹配。怎么了?正如您可能已经看到\b\w+(ing|s)\b无法知道“它应该或哪个部分”,因此我们需要引入括号:\w+?。恭喜你,你现在已经到了一个正在运行的正则表达式了!

为什么(以及如何)这与我先给出的例子不同?首先我写了\w+而不是?+AaAAbA变成了非贪婪的版本。如果你知道贪婪和非贪婪之间的区别,请跳过这一段。请考虑以下事项:A我们希望匹配大字母A\w+A附带的内容。一个天真的尝试:A,所以用AaA括起来的一个或多个单词字符。这与AaAAbA匹配,但A\w仍然可以由*+?匹配。如果没有进一步配置,?量词会尽可能地匹配 。有时,就像在A示例中,您不希望这样,您可以在量词之后使用\w来表示您想要一个非贪婪的版本,一个尽可能少匹配的版本< / em>的。

但在我们的情况下,这不是必需的,这些单词很好地被空格分隔,空格不是+的一部分。所以实际上你可以让.变得贪婪,一切都会好起来的。如果您使用(?:s|ing)(任何角色),您通常需要注意不要与之匹配。

另一个区别是使用(s|ing)代替?:I want to go to \w+在这做什么?它将捕获组更改为非捕获组。一般来说,你不想从正则表达式获得“一切”。请考虑以下正则表达式:\w+。您对整个句子不感兴趣,但仅在I want to go to (\w+)中,因此您可以在组中捕获它:|。这意味着您对此特定信息感兴趣,并希望稍后检索它。有时(比如使用s时)需要将表达式组合在一起,但对其内容不感兴趣,则可以将其声明为非捕获。否则,您将获得该组(ingre.findall(),但不会获得实际的字词!

总结一下: *从小开始 *一个接一个地添加一个案例 *总是用例子测试

事实上我刚试过, "fishing words") \ b \ w +(?:ing | s)\ b \w+(?:ing|s)但它没有用。 {{1}}有效。我不知道为什么,也许别人可以解释一下。正则表达式是一个神秘的东西,只能使用它们来轻松,轻松地测试任务。

答案 1 :(得分:0)

一般来说,我使用\ b来匹配“字边界”与\ w匹配字组件([A-Za-z0-9_]的捷径)。然后你可以做一个或分组来匹配“s”或“ing”。结果是:

/\b\w+(s|ing)\b/