Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从正则表达式中的字符开始跳过_Python_Regex - Fatal编程技术网

Python 从正则表达式中的字符开始跳过

Python 从正则表达式中的字符开始跳过,python,regex,Python,Regex,我有这样一个字符串: ^.*:(v?)(?P<version>[^-]*)(?:-.*)$ :v3.11.3-4.38 我想在名为version的变量中获取:v3.11.3(并跳过-4.38) 我正在尝试但没有帮助: ^.*:(v?)(?P<version>.*(?:-.*)$) ^.*:(v?(*P.*(:-.*)) 是否可以跳过捕获组中的连字符(或任何特定字符)和以下字符?只需将要排除在捕获组之外的部分的图案放在捕获组之外,如下所示: ^.*:(v?)(?P&l

我有这样一个字符串:

^.*:(v?)(?P<version>[^-]*)(?:-.*)$
:v3.11.3-4.38

我想在名为
version
的变量中获取
:v3.11.3
(并跳过
-4.38

我正在尝试但没有帮助:

^.*:(v?)(?P<version>.*(?:-.*)$)
^.*:(v?(*P.*(:-.*))

是否可以跳过捕获组中的连字符(或任何特定字符)和以下字符?

只需将要排除在捕获组之外的部分的图案放在捕获组之外,如下所示:

^.*:(v?)(?P<version>[^-]*)(?:-.*)$
^.*:(?:-*)(v?(?)$

由于在版本号之后还有一个“包罗万象”的
*
,因此我将
-
从中排除,这样它将只匹配字符串,直到
-

为止,似乎您希望获得符合
:v?
模式的行上的最后一个匹配版本

你可以用

^.*:v?(?P<version>\d+(?:\.\d+)*)
^.*:v.(?P\d+(?:\。\d+)*)
如有必要,移动
括号以调整命名组的开头

详细信息

  • ^
    -字符串的开头
  • *
    -除换行符以外的任何0个或更多字符,尽可能多
  • :v?
    -
    :v
  • (?P\d+(?:\.\d+*)
    -命名捕获组
    版本
    :1个以上数字,然后是0个或更多序列的
    和1个以上数字

如果我理解正确,您只需要这样一个简单的表达式
(:v\d\.\d\d\.\d)

您可以这样使用它:

>>> import re
>>> line = ':v3.11.3-4.38'
>>> searchObj = re.search( r'(:v\d\.\d\d\.\d)', line)
>>> version = searchObj.group(1)
>>> version
':v3.11.3'
这适用于Python 2和Python 3

是否可以跳过捕获组中的连字符(或任何特定字符)和以下字符


不,您必须使用两个单独的组来实现此目的。

请尝试使用
^.*(-p:v?\d+(?:\。\d+)
,请参阅您可以使用
version=re.sub(r'-.$,'',value)
Hi@kmar,你想得到什么?你是只把这个特殊字符串作为源字符串还是有这种模式的meny字符串:
^.*:v\d\.\d\d\.\d\d.*$:
?你的例子很有效-但我有点困惑-你正在使用\.\d+作为非捕获组的一部分-但它仍然需要捕获这些值-PS:如果我删除?:在你的regex中它是第一个库马尔的非捕获组模式仍然消耗文本,你不能期望正则表达式引擎跳过中间的部分匹配。如果你使用<代码> R.FunDAL\<代码> > <代码> ^ *:v?(?p\d+(\\d+)*),你会看到区别。嗨@Rob谢谢!如果输入是:v3.11.3-4.38,你的例子就可以了。但是有一种情况,输入是:v3.11.3(我希望是:v3.11.3作为输出),它不起作用。这里有什么帮助吗?啊,如果有可能的话,那么你可以在最后一组后面放一个
,像这样
。*(?)P[^-]*(?:-*))?$
。这将使它成为可选的,但也确保在版本号和字符串结尾之间不能有任何其他字符。如果您不关心版本号之后字符串其余部分的格式,则可以完全删除正则表达式的最后一部分,即
^.*:(v?(.P[^-]*)