Python3在行尾重新匹配字符或不匹配字符

Python3在行尾重新匹配字符或不匹配字符,python,regex,Python,Regex,我有一行文本,我需要从中提取一个子字符串,该子字符串后面可能有字符,也可能没有字符。 示例: Robin Hood viewed item "something.mov" (99.12345.567891011) 或者 我需要拉括号内的子字符串。子字符串始终是由两个句点分隔的三组数字。结尾带有.mov引号的字符串也可以包含任意字符,因此搜索应始终从行尾开始 如果结束参数后有字符,则行尾将有一个。如果结束符后面没有字符,则行尾将没有 现在我有: mo = re.search(r'(\d[\d.]

我有一行文本,我需要从中提取一个子字符串,该子字符串后面可能有字符,也可能没有字符。 示例:

Robin Hood viewed item "something.mov" (99.12345.567891011)
或者

我需要拉括号内的子字符串。子字符串始终是由两个句点分隔的三组数字。结尾带有
.mov
引号的字符串也可以包含任意字符,因此搜索应始终从行尾开始

如果结束参数后有字符,则行尾将有一个
。如果结束符后面没有字符,则行尾将没有

现在我有:

mo = re.search(r'(\d[\d.]*)\).*$', data1)

然而,这在一些比赛中中断。问题是,我正在使用的工具(Matillion)没有吐出它出现故障的行,所以我不知道原因。

进一步调查后,我发现在我正在寻找的子字符串之后,子字符串中永远不会有paren,所以我只使用str.rfind()来分离我想要的内容。

看起来这样应该可以:

mo = re.search(r'\((\d+\.\d+\.\d+)\)'), data1);
这与一个左括号、三组由
分隔的数字以及一个右括号相匹配。这些数字集将位于捕获组1中

如果只想匹配行上最后一组括号,可以使用:

mo = re.search(r'\((\d+\.\d+\.\d+)\)[^()]*$'), data1);

[^()]*$
确保此集合和行尾之间没有更多的括号。

此正则表达式应该可以工作:
*\((\d+\.\d+\.\d+)

我添加了一个前缀,该前缀使用下一个组之前的所有字符,因此将忽略上次出现的
\((\d+\.\d+\.\d+\)
之前的所有字符。这以与
$
不同的方式断言行末尾的位置


如果只需要括号内的子字符串,为什么还要关心其后的内容?只要把括号和里面的数字匹配一下就行了。之前文件名中可能有括号,在我发布这篇文章的时候,我不知道以后再也不会有括号了。因为我知道现在我只是在使用rfind。
mo = re.search(r'\((\d+\.\d+\.\d+)\)[^()]*$'), data1);