我编写了一个正则表达式来匹配python中的带连字符的单词
regexp = r"[a-z]+(?:-[a-z]+)*"
匹配带有零个或多个连字符的单词。对于例如abc,acd-def,x-y-y等 但是,我找不到这个分组运算符?:for shell(例如使用grep)。在我看来,这是python正则表达式的一个特性,而不是标准正则表达式。
任何人都可以告诉我如何在shell中编写相同的正则表达式吗?
答案 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] ]]
。
您可以将两个正则表达式与|
结合使用,如下所示:[a-z]|[a-z][-a-z]*[a-z]
。
在你的问题的行之间进行阅读 - “匹配带连字符的单词”听起来更像是你想要[a-z]+(-[a-z]+)+
这样的正则表达式,这样你的匹配中至少有一个-
。