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[^-]*)
。