Bash shell(grep)相当于这个python正则表达式?

时间:2015-08-05 09:55:51

标签: regex bash

我编写了一个正则表达式来匹配python中的带连字符的单词

regexp = r"[a-z]+(?:-[a-z]+)*"

匹配带有零个或多个连字符的单词。对于例如abc,acd-def,x-y-y等 但是,我找不到这个分组运算符?:for shell(例如使用grep)。在我看来,这是python正则表达式的一个特性,而不是标准正则表达式。

任何人都可以告诉我如何在shell中编写相同的正则表达式吗?

2 个答案:

答案 0 :(得分:3)

pattern匹配*而未捕获匹配内容。它与以下( )一起使用,允许您指定re.search()内容的零个或多个匹配项,而无需创建捕获组。如果您使用MatchObject之类的内容,这会影响python中的结果,因为(?: )不会包含?:中的部分。在grep中,结果不会以相同的方式返回,因此只需删除grep -E '[a-z]+(-[a-z]+)*' file 即可使用普通组:

-E

我在这里使用-o开关来启用扩展正则表达式支持。这将输出与模式匹配的每一行 - 您可以添加\1开关以仅打印匹配的部分。

正如评论中所提到的(感谢), 可以使用grep的反向引用(如?:)来引用模式中的先前捕获组,因此从技术上讲移除action_send会略微改变行为,虽然这不是您目前正在做的事情,所以它并不重要。

答案 1 :(得分:1)

您的正则表达式不会“匹配带连字符的单词” - 它匹配由[-a-z]组成的单词,其中第一个和最后一个字符必须位于[a-z]中。即它匹配[a-z](单字母单词)或[a-z][-a-z]*[a-z]

您的问题含糊不清 - bash通常会处理通配符表达式; grep可以处理正则表达式

  • 使用wilcards无法做到这一点。您可以使用=~括号内的[[ ]]运算符:[[ $string =~ [a-z]|[a-z][-a-z]*[a-z] ]]

  • grep的

    您可以将两个正则表达式与|结合使用,如下所示:[a-z]|[a-z][-a-z]*[a-z]

在你的问题的行之间进行阅读 - “匹配带连字符的单词”听起来更像是你想要[a-z]+(-[a-z]+)+这样的正则表达式,这样你的匹配中至少有一个-