我很难理解正则表达式模式。有人可以帮助我正则表达式模式匹配所有以s结尾的单词。并以a开头并以(如ana)结束。 我怎么写结尾?
答案 0 :(得分:2)
单词边界由\b
给出,因此以下正则表达式匹配以ing或s结尾的单词:"\b(\w+?(?:ing|s))\b"
其中\b
是单词边界,\w+
是一个或更多“单词字符”和(?:ing|s)
是一个未被捕获的ing
或s
组。
当你问“如何开发正则表达式”时:
首先:不要将regex用于复杂的任务。它们难以阅读,编写和维护。例如,有a regex that validates email addresses - 但它的计算机是生成的,在实践中你不应该使用它。
开始简单并添加边缘案例。在开始时计划您需要使用的字符:您说您需要以s
或ing
结尾的单词。所以你可能需要一些东西来表示一个单词,单词的结尾以及文字字符s
和ing
。什么是单词?这可能会因情况而异,但至少每个字母字符都会发生变化。查看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
时)需要将表达式组合在一起,但对其内容不感兴趣,则可以将其声明为非捕获。否则,您将获得该组(ing
或re.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/