如果字符串中存在模式,则匹配模式

时间:2019-08-07 08:18:11

标签: python regex

我正在尝试构造具有以下要求的正则表达式

  1. 模式应以字母a-z开头
  2. 可以包含字符类[\w:-]中的任何字符。
  3. 可以有任意数量的下划线_,但前提是该模式中的下划线之前有:

一些有效模式的例子

hello123

你好:123

你好你好

hello:123-hello_345#有效的模式,因为在:之前的模式中有一个_

hello-1:hell_world_123

无效的模式

hello_123

hello-123_world

hello_123:world

我尝试使用先行方式,但由于某种原因它不起作用,以下是我想出的模式

^[a-z]+[a-z0-9:-]*(?<=:)[_]*\w*-该模式的问题在于,如果字符串中的任何地方都没有:,它将停止匹配整个模式,因此它使:成为必需的模式

我只想检查:之前的字符串中是否有_的地方,:的存在。

3 个答案:

答案 0 :(得分:1)

您可以使用

^(?![^_:]*_)[a-z][\w:-]*$

如果存在(?![^_:]*_)_之前的_,则:否定超前将使匹配失败。

请参见regex demoregex graph

enter image description here

详细信息

  • ^-字符串的开头
  • (?![^_:]*_)-如果除_:之外还有0个以上的字符,则负向查找将导致匹配失败,紧随其后的是当前位置右侧的_
  • [a-z]-小写的ASCII字母
  • [\w:-]*-0个以上的单词,:-个字符
  • $-字符串的结尾。

答案 1 :(得分:0)

可以使用“或”运算符来解决:

^[a-z]+[a-z0-9-]*(:[a-z0-9-_]*|[a-z0-9-]*)$

成为亲吻的好处。

答案 2 :(得分:0)

^[a-z]+[a-z0-9-]*((:.+)|(:[a-z0-9-_]*)|[a-z0-9-]*)$ 因此,可以通过在OR子句中添加模式组来解决。 这确实适用于您给出的示例。 您可以添加是否有任何未被捕获的组。

希望有帮助!