【问题标题】:Regular expression pattern questions?正则表达式模式问题?
【发布时间】:2015-04-14 17:37:27
【问题描述】:

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

【问题讨论】:

  • 到目前为止您尝试过什么?除了official documentation,网上都有教程。
  • 我使用\b([A-Za-z]*(?:ing|s))\b 做到了:regex101.com/r/zD9sE8/1 ?: 是非捕获组语法。我们只使用它,以便我们可以使用交替符号|。 \b 用于单词边界,如下同义词的答案中所述。
  • 你能帮我分解每个部分吗?哪一部分代表结束?

标签: python


【解决方案1】:

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

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

首先:不要将正则表达式用于复杂的任务。它们很难阅读、编写和维护。例如有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。我们现在可以匹配一个单词!我们仍然需要sing| 转换为或,那么以下内容如何:\b\w+ing|s\b?如果你对此进行测试,你会发现它会匹配像 ingest 这样不应该匹配我们的正则表达式的令人困惑的东西。怎么了?您可能已经看到| 无法知道“它应该或”,所以我们需要引入括号:\b\w+(ing|s)\b。恭喜,您现在已经获得了一个有效的正则表达式!

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

但在我们的例子中,这不是必需的,单词被空格很好地分隔,这不是\w 的一部分。所以事实上你可以让+变得贪婪,一切都会好起来的。如果您使用.(任何字符),您通常需要注意不要匹配太多。

另一个区别是使用(?:s|ing) 而不是(s|ing)?: 在这里做什么?它将捕获组更改为非捕获组。通常,您不想从正则表达式中获得“一切”。考虑以下正则表达式:I want to go to \w+。您对整个句子不感兴趣,而只对\w+ 感兴趣,因此您可以将其捕获在一个组中:I want to go to (\w+)。这意味着您对此特定信息感兴趣并希望稍后检索它。有时(例如使用| 时)您需要将表达式组合在一起,但对它们的内容不感兴趣,然后您可以将其声明为非捕获。否则你会得到这个组(sing),但不是真正的单词!

总结一下: * 从小处着手 * 一个接一个地添加一个案例 * 总是用例子来测试

实际上我只是尝试了re.findall(\b\w+(?:ing|s)\b, "fishing words"),但没有成功。 \w+(?:ing|s) 有效。我不知道为什么,也许其他人可以解释一下。正则表达式是一种神秘的东西,只能将它们用于简单且易于测试的任务。

【讨论】:

  • 因为我需要以 ing 或 s 结尾的词。我不需要 '\>' 吗??
  • @doctorwho11 为什么你认为你需要“\>”?你在谈论HTML吗?你能给出一个示例文本以及你想从中提取什么单词吗?
  • 我正在查看不同的教程来学习并看到了这个cheatography.com/davechild/cheat-sheets/regular-expressions。它说 \> 用于词尾
  • @doctorwho11 也许该备忘单是针对不同语言的。看看the python specification。它也有一些基本的例子。特别是 example on adverbs 看起来与您的情况相似。所以你不能使用\>,因为python regex 不理解那个语法,但是如果可以的话,你可以使用它。
【解决方案2】:

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

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

【讨论】:

  • 非常感谢您的回答.. 但是您能解释一下您是如何做到的吗?我想学这个
  • 我从来没有使用过更复杂的正则表达式,比如一个同义词正在使用,所以在这方面我可能落后了。我从 sed 和 gawk 之类的文本处理程序开始 - 这些程序为基本的正则表达式奠定了基础,而不会不知所措(例如:gnu.org/software/gawk/manual/gawk.html 并进入第 3 节)。我发现 Perl/Python 增强的正则表达式非常复杂,很容易被吓倒。从“。”开始简单。和“*”和“+”然后你会发现自己在寻找你需要的棘手的东西。
猜你喜欢
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
  • 2011-01-25
相关资源
最近更新 更多